2009-11-28 10 views

Odpowiedz

16

Możesz to zrobić za pomocą wyrażeń regularnych i fragmentu 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); 

wyjściowa:

4df 
5yu 
6nf 

Oto co wyrażenie regularne oznacza:

\[ : 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

Doskonały, naprawdę fajny. – Ravia

+0

Dziękuję za odpowiedź, grałem, ale nie mogłem nią zarządzać - w jaki sposób zmienić wyrażenie, aby zawierało nawiasy klamrowe? –

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

@ "[[([^]] *) \]" wydaje się być ulubionym wzorem. –

1

Th Kluczem e jest prawidłowe unikanie znaków specjalnych używanych w wyrażeniach regularnych, na przykład możesz dopasować znak [ w ten sposób: @"\["

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

Trzeba będzie przyciąć nawiasów kwadratowych wyłączony, ważnym elementem jest operatorem leniwy .

+0

Nie będzie działał w wielu liniach, nawet jeśli podasz RegexOptions.Multiline (wiem, próbowałem;)) –

+0

Działa w linii wielokrotności dobrze dla mnie –

+0

Możesz użyć Regex.SingleLine - to prawie działa, ale przechwytuje \ n także. W rzeczywistości może to nawet przynieść nieco lepszą wydajność niż rozwiązanie, które przedstawiłem, ponieważ musi tylko zastąpić przechwycone części ciągu, a nie cały łańcuch. –

Powiązane problemy