2010-01-20 5 views
3

s'il vous plaît aidez-moi ce problème. Je veux diviser "-action = 1" en "action" et "1".Aidez-moi à diviser la chaîne en utilisant RegExp

string pattern = @"^-(\S+)=(\S+)$"; 
Regex regex = new Regex(pattern); 
string myText = "-action=1"; 
string[] result = regex.Split(myText); 

Je ne sais pas pourquoi les résultats ont une longueur = 4.

result[0] = "" 
result[1] = "action" 
result[2] = "1" 
result[3] = "" 

Aidez-moi s'il vous plaît.

P/S: J'utilise .NET 2.0.

Merci.

Bonjour, j'ai testé avec une chaîne: @ "- destination = C: \ Program Files \ Release" mais il a un résultat inexact, je ne comprends pas pourquoi la longueur du résultat = 1. Je pense parce qu'il a un espace blanc chaîne.

Je veux le diviser à "destination" & "C: \ Program Files \ Release"

Plus d'info: Ceci est mon exigence: -string1 = string2 -> il Split à: string1 string2 &. In string1 & string2 ne contient pas de caractères: '-', '=', mais ils peuvent contenir des espaces.

S'il vous plaît aidez-moi. Merci.

+0

Bonjour, J'ai testé avec la chaîne: @ "- destination = C: \ Program Files \ Release" mais ont des résultats inexacts, je ne comprends pas pourquoi la longueur du résultat = 1. Je pense que parce qu'il a un espace blanc dans la chaîne. Je veux le diviser en "destination" et "C: \ Program Files \ Release" S'il vous plaît, aidez-moi. Merci. –

Répondre

3

Essayez cette (mis à jour pour ajouter Regex.Split):

string victim = "-action=1"; 
string[] stringSplit = victim.Split("-=".ToCharArray()); 
string[] regexSplit = Regex.Split(victim, "[-=]"); 

EDIT: En utilisant votre exemple:

string input = @"-destination=C:\Program Files\Release -action=value"; 
foreach(Match match in Regex.Matches(input, @"-(?<name>\w+)=(?<value>[^=-]*)")) 
{ 
    Console.WriteLine("{0}", match.Value); 
    Console.WriteLine("\tname = {0}", match.Groups["name" ].Value); 
    Console.WriteLine("\tvalue = {0}", match.Groups["value"].Value); 
} 
Console.ReadLine(); 

Bien sûr, ce code ont des problèmes si votre chemin contient - caractère

0

Quel est le problème avec l'utilisation de string.split()?

string test = "-action=1"; 
string[] splitUp = test.Split("-=".ToCharArray()); 

je l'avoue, bien que cela vous donne encore peut-être plus de paramètres que vous souhaitez voir dans le tableau diviser ...

[0] = "" 
[1] = "action" 
[2] = "1" 
+0

Qu'est-ce qui ne va pas? Vous n'obtenez pas de validation d'entrée gratuite, et cela peut gérer les choses différemment (imaginez '-range = 1-2'). – Lucero

+0

Accordé, mais avec RegEx, vous n'obtenez * * rien * gratuitement, et comme l'OP l'a vu, ce n'est pas une tâche triviale de construire la chaîne regex appropriée. Je suggère juste une alternative raisonnablement réalisable qui ne compte pas sur connaître l'inconnu (voir l'édition d'OP) – ZombieSheep

5

Ne pas utiliser Split, il suffit d'utiliser Match , puis obtenez les résultats de la collection Groups par index (index 1 et 2).

Match match = regex.Match(myText); 
if (!match.Success) { 
    // the regex didn't match - you can do error handling here 
} 
string action = match.Groups[1].Value; 
string number = match.Groups[2].Value; 
+0

Vous ne devriez jamais employer des groupes par l'index dans. NET Regex ... vous pouvez nommer les groupes pour une raison. Imaginez si quelqu'un a légèrement modifié l'expression rationnelle plus tard en ajoutant un autre ensemble de parenthèses. Ensuite, vous devrez changer tous vos index partout. - Utilisez les noms de groupe à la place. –

+0

Je n'utilise que des index pour des cas très simples, comme celui-ci (juste une ou deux captures, pas de groupes imbriqués, etc.). Sinon, je suis d'accord que l'utilisation de noms rend l'expression rationnelle beaucoup plus robuste et plus facile à comprendre. – Lucero

+0

Bonjour, j'ai testé avec string: @ "- destination = C: \ Program Files \ Release" mais son résultat est inexact. Je pense parce qu'il a un espace blanc dans la ficelle. Je veux le diviser en "destination" & "C: \ Program Files \ Release" –

3

Dans .NET Regex, vous pouvez nommer vos groupes.

string pattern = @"^-(?<MyKey>\S+)=(?<MyValue>\S+)$"; 
Regex regex = new Regex(pattern); 
string myText = "-action=1"; 

Faites ensuite une "correspondance" et obtenez les valeurs par vos noms de groupe.

Match theMatch = regex.Match(myText); 
if (theMatch.Success) 
{ 
    Console.Write(theMatch.Groups["MyKey"].Value); // This is "action" 
    Console.Write(theMatch.Groups["MyValue"].Value); // This is "1" 
} 
0

Dans son discours Regular Expression Mastery, Mark Dominus attributes la règle utile suivante Learning Perl auteur (et fellow StackOverflow user) Randal Schwartz:

  • Utilisez la capture ou m//g [ou regex.Match(...)] lorsque vous sache ce que tu veux garder. Utilisez split lorsque vous savez ce que vous voulez jeter.
Questions connexes