2009-11-28 8 views

Répondre

16

Vous pouvez le faire avec des expressions régulières, et un peu de Linq.

string s = "test [4df] test [5y" + Environment.NewLine + "u] test [6nf]"; 

    ICollection<string> matches = 
     Regex.Matches(s.Replace(Environment.NewLine, ""), @"\[([^]]*)\]") 
      .Cast<Match>() 
      .Select(x => x.Groups[1].Value) 
      .ToList(); 

    foreach (string match in matches) 
     Console.WriteLine(match); 

Sortie:

4df 
5yu 
6nf 

Voici ce que les moyens d'expression régulière:

\[ : Match a literal [ 
( : Start a new group, match.Groups[1] 
[^]] : Match any character except ] 
* : 0 or more of the above 
) : Close the group 
\] : Literal ] 
+0

Excellent, vraiment cool. – Ravia

+0

Merci pour la réponse, j'ai joué sur mais incapable de le gérer - comment pourrais-je changer la regex de sorte qu'il était inclus des crochets? –

3
Regex regex = new Regex(@"\[[^\]]+\]", RegexOptions.Multiline); 
+0

@ "\ [([^]] *) \]" semble être un motif favori. –

1

Th La clé est d'échapper correctement les caractères spéciaux utilisés dans les expressions régulières, par exemple vous pouvez faire correspondre un caractère [ de cette façon: @"\["

0
Regex rx = new Regex(@"\[.+?\]"); 
var collection = rx.Matches(s); 

Vous aurez besoin de couper les crochets, la partie importante est l'opérateur paresseux .

+0

Ne fonctionnera pas sur plusieurs lignes, même si vous spécifiez RegexOptions.Multiline (je sais, j'ai essayé;)) –

+0

Fonctionne sur plusieurs lignes très bien pour moi –

+0

Vous pouvez utiliser Regex.SingleLine - cela fonctionne presque, sauf qu'il capture les \ n aussi. En fait, il serait probablement même légèrement plus performant que la solution que j'ai présentée car il suffit de remplacer les parties capturées de la chaîne plutôt que la chaîne entière. –