C # Regex.Split – Le sous-modèle renvoie des chaînes vides

Salut, première affiche sur cette communauté géniale.

J’ai une expression régulière dans mon application C # pour parsingr l’affectation d’une variable:

NewVar = 40 

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

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

Mon objective était de supprimer les espaces dans Regex et de ne pas utiliser la méthode Trim () des valeurs renvoyé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 retourné de Regex.Split:

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

Ma question est donc la suivante: pourquoi renvoie-t-il une chaîne vide au début et à la fin?

Merci.

Reson RegEx.Split renvoie quatre valeurs, c’est que vous avez exactement une correspondance. RegEx.Split renvoie:

  • Tout le texte avant votre match, qui est “”
  • Tous les groupes de votre match, qui sont “NewVar” et “40”
  • Tout le texte après votre correspondance, qui est “”

Le but principal de RegEx.Split est d’extraire tout texte entre les expressions rationnelles correspondantes. Par exemple, vous pouvez utiliser RegEx.Split avec un motif de “[,;]” pour scinder le texte en virgules ou en points-virgules. Dans NET Framework 1.0 et 1.1, Regex.Split n’a renvoyé que les valeurs fractionnées, dans ce cas “” et “”, mais dans NET Framework 2.0, il a été modifié pour inclure également les valeurs correspondant à () dans Regex, raison pour laquelle vous êtes voir “NewVar” et “40” du tout.

Ce que vous cherchiez, c’est Regex.Match , pas Regex.Split . Cela fera 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 – cela n’a rien à voir avec le texte correspondant. Puisque vous n’avez pas d’espace supplémentaire dans votre modèle, c’est inutile.

Dans les documents , Regex.Split() utilise l’expression régulière comme délimiteur sur Regex.Split() se scinder. Il ne sépare pas les groupes capturés de la chaîne d’entrée. En outre, IgnorePatternWhitespace ignore les espaces non IgnorePatternWhitespace de votre modèle, pas l’entrée.

Au lieu de cela, essayez ce qui suit:

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

Notez que les espaces sont réellement consommés en tant que partie du délimiteur.