2016-03-19 13 views
0

Ich fange eine Gruppe von Regex und ich möchte alles fangen, aber nicht die Gruppe (n). So Gruppe kann mehrere Vorkommen an verschiedenen Orten in der Zeichenfolge haben.Kann ein Quantifizierer für eine nicht einfangende Gruppe verwendet werden? - Regex

Mein erster Gedanke war, es mit negativem Lookahead zu lösen, aber ich scheiterte damit. Deshalb habe ich es mit nicht einfangender Gruppe versucht und bin auch hier geblieben.

(bar) (baz) foo

Ich möchte foo.

Dies ist, was ich bisher:

String input = "(bar) (baz) foo"; 


String matchesGroup = "((?=\\().*?\\))"; //matches (...) 

// as Casimir et Hippolyte commented, I know use 
// ((?:(...))+) for the non capturing group 

String matchesFoo = "((?:"+ matchesGroup +")+)\\s(.*)"; 

Pattern pattern = Pattern.compile(matchesFoo); 
Matcher matcher = pattern.matcher(input); 

while (matcher.find()){ 
     System.out.println(matcher.group()); 
} 

aber es gibt nichts an allen

gefangen

aktuell:

erwartet: foo

Wo ist mein Fehler in der Regex?

+2

Sie müssen die nicht-c wiederholen apturing group, nicht '(match)'. Setzen Sie die Whitespace-Zeichenklasse in die nicht erfassende Gruppe. –

+0

Nun, Sie sagen nicht, dass Leerzeichen zwischen den Vorkommen von Übereinstimmungen erwartet werden. Die Zeichenfolge 'matchsmatches foo' funktioniert anstelle Ihres zweiten Beispiels. – bcsb1001

+0

Sie wollen also alles von der Eingabezeichenfolge, die nicht innerhalb einer öffnenden und schließenden Klammer ist? – dpr

Antwort

1

da Sie mehrere (...) Gruppen übereinstimmen soll, entfallen auf die mögliche nachstehendes Leerzeichen und die + bewegen ein oder mehrere von denen, zu quantifizieren (ich zog den Raum in der Gruppe, und die + Quantifizierungs dass ganze Struktur)

String matchesFoo = "(?:(?:(?=\\().*?\\))\\s?)+(.*)"; 

demo here

+0

Es kann doppelt so effizient gemacht werden, wenn Lookarounds mit einem verbrauchenden Muster ersetzt werden. –

0

Warum nicht versuchen Sie dies:

String testtring = "matches matches foo"; 
testString = testString.replaceAll("matches", ""); 
System.out.println(testString); 
+0

Ich habe es vorher versucht, aber ich möchte mit Gruppen arbeiten, da ich sie danach brauchen – jam

Verwandte Themen