2009-11-14 7 views
6

Hey, première fois poster sur cette communauté géniale.C# Regex.Split - Subpattern renvoie des chaînes vides

J'ai une expression régulière dans mon application C# pour analyser une affectation d'une variable:

NewVar = 40 

qui est entré dans une zone de texte. Je veux que mon expression régulière retourne (en utilisant Regex.Split) le nom de la variable et la valeur, assez simple. C'est le Regex je jusqu'à présent:

var r = new Regex(@"^(\w+)=(\d+)$", RegexOptions.IgnorePatternWhitespace); 
var mc = r.Split(command); 

Mon but était de faire le parage des espaces blancs du Regex et ne pas utiliser la méthode trim() des valeurs retournées. Actuellement, cela fonctionne mais il renvoie une chaîne vide au début de MatchCollection et une chaîne vide à la fin.

En utilisant l'exemple d'entrée ci-dessus, voici ce qui est de retour de Regex.Split:

mc[0] = "" 
mc[1] = "NewVar" 
mc[2] = "40" 
mc[3] = "" 

Alors ma question est la suivante: pourquoi il ne retourne une chaîne vide au début et à la fin?

Merci.

+0

"Je veux que mon expression régulière retourne (en utilisant Regex.Split) le nom de la variable et la valeur, assez simple. "- pourquoi ne pas utiliser Regex.Match à la place? – Juliet

+0

Sans savoir comment l'information est utilisée, la seule différence est la possibilité de retourner un tableau de chaînes au lieu de travailler avec IMHO, 'Regex.Match' est plus intuitif, mais peut-être il y a une raison de favoriser le tableau de chaînes – jheddings

Répondre

5

Le Reson RegEx.Split revient quatre valeurs est que vous avez exactement un match, alors RegEx.Split est de retour:

  • Tout le texte avant votre match, ce qui est « »
  • Tous () des groupes dans votre match, qui sont « NewVar » et « 40 »
  • tout le texte après votre match, ce qui est « »

but principal de RegEx.Split est d'extraire le texte entre l'expression rationnelle correspondante, par exemple vous pouvez utiliser RegEx.Split avec un motif de "[,;]" pour diviser le texte sur les virgules ou les points-virgules. Dans NET Framework 1.0 et 1.1, Regex.Split n'a renvoyé que les valeurs de fractionnement, dans ce cas "" et "", mais dans NET Framework 2.0, il a été modifié pour inclure également des valeurs trouvées par() dans la Regex, ce qui explique pourquoi voir "NewVar" et "40" du tout. Ce que vous cherchez est Regex.Match, pas Regex.Split. Il va faire exactement ce que vous voulez:

var r = new Regex(@"^(\w+)=(\d+)$"); 
var match = r.Match(command); 
var varName = match.Groups[0].Value; 
var valueText = match.Groups[1].Value; 

Notez que RegexOptions.IgnorePatternWhitespace signifie que vous pouvez inclure des espaces supplémentaires dans votre modèle - il n'a rien à voir avec le texte correspondant. Puisque vous n'avez aucun espace supplémentaire dans votre modèle, il est inutile.

1

From the docs, Regex.Split() utilise l'expression régulière comme délimiteur à diviser. Il ne sépare pas les groupes capturés de la chaîne d'entrée. En outre, le IgnorePatternWhitespace ignore les espaces non échappés dans votre modèle, pas l'entrée.

Au lieu de cela, effectuez les opérations suivantes:

var r = new Regex(@"\s*=\s*"); 
var mc = r.Split(command); 

Notez que les espaces blancs est effectivement consommée comme une partie du delimiter.

+0

Je ne vois pas vraiment l'avantage d'utiliser Regex.Split sur String.Split pour ce code – Juliet

+0

@Juliet L'OP espérait éviter d'utiliser 'Trim()' pour supprimer les espaces supplémentaires autour du signe '=' .Ce n'est pas aussi efficace à exécuter, mais il enregistre les lignes de code supplémentaires , Je suppose – jheddings

+0

Votre Regex modifié fonctionne Oui, j'espérais enregistrer quelques lignes de code De plus, votre Regex fonctionnera si j'ai plusieurs affectations: NewVar = OldVar = 5. Merci. – ademers

Questions connexes