2016-04-28 10 views
4

Ich habe einen Text wieRegex, um Text zwischen Klammern zu erhalten, die mit gelegentlichen fehlenden Klammern arbeitet

The quick brown [fox] jumps over the lazy [dog] 

Wenn ich die Regex verwenden

\[(.*?)\] 

ich Matches bekommen als

fox 
dog 

Ich suche nach einer Regex, die auch dann funktioniert, wenn eine der Klammern fehlt.

Zum Beispiel, wenn ich Text wie diese

The quick brown [fox jumps over the lazy [dog] 

haben mag ich die Spiele "dog" zurückzukehren

Update: Ein weiteres Beispiel, wenn ich Text wie diese

The quick brown [fox] jumps over the lazy dog] 

Ich möchte die Übereinstimmungen zurückgeben "Fuchs"

Der Text kann mul Tiple Matches und mehrere Klammern können auch fehlen :(.

Ich kann auch C# verwenden, um Teilstring der Ergebnisse, die ich von Regex übereinstimmt.

+0

Dies ist nur mit Bilanzkreisen möglich. –

+0

Erfüllt das Ein-Wort-Match Ihren Bedarf? – Xiaoy312

Antwort

1

Wenn Sie zwischen dem am nächsten [ und ] aber [ und ] alles passen während der Aufnahme, was im Inneren ist, verwenden

\[([^][]*)] 

Muster Details

  • \[ - eine wörtliche [
  • ([^][]*) - Gruppe 1 captur ing 0+ andere Zeichen als [ und ] (als [^...] ist eine negierte Zeichenklasse und sie entspricht alle Zeichen andere als die in der Klasse definiert ist) (diese Gruppe 1-Wert wird über Regex.Match(INPUT_STRING, REGEX_PATTERN).Groups[1].Value zugegriffen wird)
  • ] - ein Literal ] (es nicht außerhalb einer Zeichenklasse entgangen sein müssen)

die regex demo See und hier ist C# demo:

var list = new List<string>() {"The quick brown [fox] jumps over the lazy dog]", 
     "The quick brown [fox] jumps over the lazy [dog]", 
     "The quick brown [fox jumps over the lazy [dog]"}; 
list.ForEach(m => 
      Console.WriteLine("\nMatch: " + 
       Regex.Match(m, @"\[([^][]*)]").Value + // Print the Match.Value 
       "\nGroup 1: " + 
       Regex.Match(m, @"\[([^][]*)]").Groups[1].Value)); // Print the Capture Group 1 value 

Ergebnisse:

Match: [fox] 
Group 1: fox 

Match: [fox] 
Group 1: fox 

Match: [dog] 
Group 1: dog 
1

Hier gehen Sie: \[[^\[]+?\]

Es vermeidet nur [ mit der char Klasse zu erfassen.

4

Versuchen Sie dieses: \[[^[]*?\]

Es wird alle Spiele überspringen, wenn es [ Zeichen enthält.

+0

Dies ist weniger effizient als mein Vorschlag, da Lazy Matching teurer ist als Gierige mit einer passenden Zeichenklasse. Auch, [es erfasst nicht 'fox', es entspricht' [fox] '] (http://regexstorm.net/tester?p=%5c%5b%5b%5e%5b%5d*%3f%5c% 5d & i = Die + schnelle + braune +% 5bfox% 5d + springt + über + die + faule + Hund% 5d% 0d% 0aDie + schnelle + braune +% 5bfox% 5d + springt + über + die + faul +% 5bdog% 5d% 0d% 0aThe + schnell + braun +% 5bfox + springt + über + die + faul +% 5bdog% 5d). –

+0

Ich habe es [hier] getestet (http://regexr.com/) und es funktioniert. Aber danke für den Hinweis. – MaKCbIMKo

+0

Ich meine nur, dass es nicht das effizienteste Muster für die aktuelle Aufgabe ist. Ich bin der Meinung, dass Sie nicht sicher sind, wie faules Matching funktioniert. Siehe [meine Antwort] (http://stackoverflow.com/questions/36770799/perl-regex-matching-optional-phrase-in-long-sentence/36787675#36787675) darüber, wie faul und gierig quantifizierte Muster funktionieren. –

Verwandte Themen