2016-06-05 6 views
-1

ich diesen Code haben:Reluctant quantifier wirkt gierig

String result = text; 

    String regex = "((\\(|\\[)(.+)(\\)|\\])){1}?"; 
    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher = pattern.matcher(result); 

    System.out.println("start"); 
    System.out.println(result); 
    while (matcher.find()) { 
     System.out.print("Start index: " + matcher.start()); 
     System.out.print(" End index: " + matcher.end() + " "); 
     System.out.println(matcher.group()); 
    } 
    System.out.println("finish"); 

Und ich habe eine Zeichenfolge, die ich passen wollen:

Some text sentence or sentences [something 234] (some things) 

Und die Ausgabe erhalte ich bei Ausführung:

start 
some text sentence or sentences [something 234] (some things) 
Start index: 32 End index: 61 [something 234] (some things) 
finish 

Nun möchte ich eigentlich, dass die gefundenen Fälle in Klammern getrennt finden, so zu finden: [etwas 234] in einem Spiel (einige Dinge) als das zweite Spiel

Kann mir bitte jemand helfen, die Regex entsprechend zu bauen? Ich bin mir nicht sicher, wie ich den widerwilligen Quantifizierer für den ganzen regulären Ausdruck setzen soll, also umgebe ich die ganzen Klammerelemente in anderen Klammern. Aber ich verstehe nicht, warum dieser zögerliche Quantor hier gierig agiert und was muss ich tun, um das zu ändern?

+0

wollen Sie den Inhalt in '[]' und '()'? – rock321987

+0

'. +' Ist nicht gierig. ". +?" wäre. – Pshemo

+0

Auch '{1}?' Scheint überflüssig. – Pshemo

Antwort

1

{1} in regex ist redundant, da jedes Element ohne spezifizierten Quantifizierer einmal gefunden werden muss. Auch macht es nur ungern macht keinen Sinn, da es nicht Bereich möglicher Wiederholungen beschreibt (wie {min,max} wo ? Zugabe würde Regex-Engine sagt Anzahl der Wiederholungen in diesem Bereich möglichst nahe an min wie möglich zu machen). Hier beschreibt {n} genaue Anzahl der Wiederholungen, also min = max = n.

Jetzt sollten Sie in der Lage sein, Ihr Problem zu lösen, indem Sie .+ (Inhalt in Klammern) widerwillig machen. Verwenden Sie dazu .+?.

So versuchen, mit:

String regex = "((\\(|\\[)(.+?)(\\)|\\]))"; 
+0

Hmm, scheint zu arbeiten, aber ich bekomme immer noch nicht, wie die Quantifier widerwillig für den Inhalt zwischen Klammern macht ir Arbeit? Warum sollte ich es dort platzieren, wenn ich nach den Klammern und dem Inhalt suche, nicht nur nach dem Inhalt? Ich bin total verwirrt, ich wäre nie auf die Idee gekommen, den widerwilligen Modifikator auf den Inhalt zu setzen ... –

+1

Versuchen Sie zu überlegen, wie ein einzelnes Ergebnis aussehen soll. Es sollte "(...)" und "[...]" sein. Wenn Sie also eine Saite wie 'aaa (foo) [bar] baz 'haben, sollte regex in der Lage sein,' ('' '' '' '' '' '' '' '') zu finden. Deshalb machen wir das '. +', Das Zeichen zwischen '(' '' '' '' '' '' ''' '' '' '' '' '' '' '' minimum) darstellt. Vielleicht erklärt dieses Tutorial es besser: http://www.regular-expressions.info/repeat.html#lazy – Pshemo