2010-09-09 11 views
6

Muszę znaleźć regex dla []Regex do niczego między []

Na przykład, jeśli ciąg jest - Cześć [Stos] Oto mój [Tag], które muszę [Znajdź].

Należy zwrócić stos, Tag, Znajdź

+1

Na jakiej platformie? W jakim języku programowania? –

+0

asp.net. Używam Regex.IsMatch() – Ankit

+2

Czy mogą być zagnieżdżone mecze: 'foo [bar [baz]] done' gdzie chcesz pobrać' bar [baz] '? A może 'foo [bar \\] baz] done' gdzie chcesz pobrać' bar] baz'? Czy może istnieć nowa linia (y) pomiędzy '[' a ']'? –

Odpowiedz

26

Całkiem proste, wystarczy (1) wsporniki ucieczki z ukośniki, oraz (2) używać (.*?) do przechwytywania zawartości.

\[(.*?)\] 

Nawiasy są grupą przechwytującą, przechwytują ich zawartość do późniejszego wykorzystania. Znak zapytania po .* powoduje, że pasujący non-chciwy. Oznacza to, że dopasuje najkrótszy możliwy mecz, a nie najdłuższy. Różnica między chciwy i zachłanny nie pojawia się, gdy masz wiele mecze w linii:

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

Chciwy mecz znajdzie najdłuższy pomiędzy dwoma zestawami znaków w nawiasach kwadratowych. To nie tak. Non-chciwy mecz znajdzie najkrótszy:

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

Anyways, kod zakończy się looking like:

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]+?)\] 

powinno działać. Być może będziesz musiał zmienić pasującą grupę, jeśli chcesz uwzględnić również znaki specjalne.

+0

Działa to nieco ładniej niż obecnie otagowana odpowiedź, ponieważ ma lepszą kontrolę nad takimi rzeczami jak: "Testuj [test] [test [test]" Taktowana odpowiedź będzie zawierać zbłąkane [w meczu, podczas gdy to wyrażenie nie będzie . – StronglyTyped

3

W zależności od tego, co masz na myśli środowisko:

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

Ah, .NET ... To było wyliczenie Emacsa. :-) –

+1

Myślę, że przegapiłeś ']' nawet w składni Emacsa. – kennytm

+1

Pozwoliłem sobie zmienić go na kompatybilny z .NET. Zauważ, że ']' wymaga jedynie ucieczki w zestawie znaków, a nie poza nim (chociaż nie ucierpiałoby to ...). –

0

składni .NET, dbanie o wielu wspornikach osadzonych:

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

ten zlicza liczbę otwartych [ sekcjach i tylko w OPEN powiedzie się, jeśli OPEN ma wartość 0 na końcu.