2010-09-09 10 views
6

ich für []Regex für irgendetwas zwischen []

Für zB die Regex finden müssen, wenn die Zeichenfolge - Hallo [Stapel] Hier ist meine [Tag] ist, die ich brauche, um [Suchen].

Es sollte zurückkehren Stapel, Tag, findet

+1

Auf welcher Plattform? In welcher Programmiersprache? –

+0

asp.net. Ich benutze Regex.IsMatch() – Ankit

+2

Kann es verschachtelte Übereinstimmungen geben: 'foo [bar [baz]] done' wo du' bar [baz] 'greifen willst? Oder vielleicht 'foo [bar \\] baz] erledigt ', wo du' bar] baz greifen willst? Kann es neue Zeilen zwischen '[' und ']' geben? –

Antwort

26

Ganz einfach, man muss nur (1), um die Klammern mit einem Backslash entkommen, und (2) verwenden (.*?) den Inhalt zu erfassen.

Die Klammern sind eine einfangende Gruppe, sie erfassen ihren Inhalt für die spätere Verwendung. Das Fragezeichen nach .* macht die Übereinstimmung nicht gierig. Dies bedeutet, dass es der kürzesten Übereinstimmung entspricht und nicht der längsten. Der Unterschied zwischen gierig und nicht gierigen kommt auf, wenn Sie mehrere Übereinstimmungen in einer Zeile haben:

Hi [Stack], Here is my [Tag] which i need to [Find]. 
    ^______________________________________________^ 

Ein gieriges Spiel wird die längste Zeichenfolge möglich zwischen zwei Sätzen von eckigen Klammern finden. Das ist nicht richtig. Ein nicht-gierige Spiel finden die kürzeste:

Hi [Stack], Here is my [Tag] which i need to [Find]. 
    ^_____^ 

Anyways, wird der Code looking like am Ende:

string regex = @"\[(.*?)\]"; 
string text = "Hi [Stack], Here is my [Tag] which i need to [Find]."; 

foreach (Match match in Regex.Matches(text, regex)) 
{ 
    Console.WriteLine("Found {0}", match.Groups[1].Value); 
} 
3
\[([\w]+?)\] 

sollte funktionieren. Möglicherweise müssen Sie die übereinstimmende Gruppe ändern, wenn Sie auch spezielle Zeichen einfügen müssen.

+0

Dies funktioniert ein bisschen schöner als die aktuell markierte Antwort, weil sie besser über Dinge wie diese verfügt: "Test [test] [test [test]" Die getaggte Antwort enthält die Streuner [im Spiel, während diese Regex nicht . – StronglyTyped

3

Je nach welcher Umgebung Sie nach:

\[([^\]]+)] 
+0

Ah, .NET ... Dies war ein Emacs Regex. :-) –

+1

Ich glaube, du hast ein ']' sogar in Emacs Syntax verpasst. – kennytm

+1

Ich habe mir die Freiheit genommen, es in ein .NET-kompatibles zu ändern. Beachten Sie, dass das ']' nur innerhalb des Zeichensatzes, nicht außerhalb davon entkommen muss (obwohl es nicht schadet, um es zu entkommen ...). –

0

.NET-Syntax von mehreren eingebetteten Klammern der Pflege:

\[ ((?: \\. | (?<OPEN> \[) | (?<-OPEN> \]) | [^\]])*? (?(OPEN)(?!))) \]

Dadurch wird die Anzahl der geöffneten [ Abschnitte in OPEN zählt und nur Erfolgt, wenn OPEN am Ende 0 ist.

Verwandte Themen