2010-09-24 3 views
2

J'ai une chaîne comme unC# meilleure solution pour une partie de chaîne entre un texte

"[echo]\r\n[echo] Building VARIANT_SETTINGS 05...\r\n[echo] VARIANT_SETTINGS file 1094_002-900208R7.0_05R01 02.hex successfully generated!\r\n" 

Comment est-il possible d'obtenir le 1094_002-900208R7.0_05R01 02.hex?

J'ai essayé de le faire via Regex.Replace, mais je ne comprends pas très bien comment cela se passe. J'ai essayé

fileName = Regex.Replace(hexOutInfo, @"^.*VARIANT_SETTINGS file ([ ._0-9a-z-]+) successfully generated!.*$", "$1"); 

Cela me renvoie le texte entier.

Répondre

3

Utilisez System.Text.RegularExpressions.Match.

Une instance de la classe Match est renvoyée par la méthode Regex.Match et représente la première correspondance de motif dans une chaîne. Les correspondances suivantes sont représentées par des objets Correspondance renvoyés par la méthode Match.NextMatch. En outre, un objet MatchCollection composé de 0, 1 ou plusieurs objets Matc h est renvoyé par la méthode Regex.Matches.

...

Si un match de modèle réussit, la propriété Value contient la sous-chaîne correspondante, la propriété Index indique la position de départ de base zéro de la chaîne correspondante dans la chaîne d'entrée, et la propriété Length indique la longueur de la sous-chaîne correspondante dans la chaîne d'entrée. Étant donné qu'une seule correspondance peut impliquer plusieurs groupes de capture, Match a une propriété Groups qui renvoie le GroupCollection. Le GroupCollection a des accesseurs qui retournent chaque groupe. Match hérite de Group afin que la totalité de la sous-chaîne correspondante soit accessible directement. En d'autres termes, l'occurrence de Match elle-même est équivalente à Match.Groups[0] (Match.Groups(0) dans Visual Basic).

Je suggère de modifier la regex pour correspondre seulement à une partie de l'entrée et pour éviter les problèmes de correspondance multi-lignes. La sous-expression de nom de fichier doit correspondre à la fois aux lettres majuscules et minuscules.

Regex mypattern = new Regex("VARIANT_SETTINGS file ([ ._0-9A-Za-z-]+) successfully generated!"); 
string filename = mypattern.Match(mytext).Groups[1].Value; 

filename devrait maintenant être "1094_002-900208R7.0_05R01 02.hex".

0

Vous devez utiliser Regex.Match. Voici une solution

var str = "[echo]\r\n[echo] Building VARIANT_SETTINGS 05...\r\n" + 
      "[echo] VARIANT_SETTINGS file 1094_002-900208R7.0_05R01 02.hex " + 
      "successfully generated!\r\n" 

var match = Regex.Match(str, @".*\sfile\s(?<name>.*\.hex)\s.*"); 
Console.WriteLine(match.Groups["name"].Value); 

rapide et sale sorties

1094_002-900208R7.0_05R01 02.hex 

si vous l'utiliser, vous pouvez souvent vouloir compiler et mettre en cache l'expression rationnelle. En outre, le modèle pourrait être amélioré, mais je vais laisser cela à votre place.

1

Une façon très simple serait:

 string hexOutInfo = "[echo]\r\n[echo] Building VARIANT_SETTINGS 05...\r\n[echo] VARIANT_SETTINGS file 1094_002-900208R7.0_05R01 02.hex successfully generated!\r\n"; 

     string leftCrop = hexOutInfo.Replace("[echo]\r\n[echo] Building VARIANT_SETTINGS 05...\r\n[echo] VARIANT_SETTINGS file ", ""); 
     string hexFileName = leftCrop.Replace(" successfully generated!\r\n", ""); 
Questions connexes