2012-04-03 14 views
3

Ich habe die folgende Zeichenfolge:Ein Regex, um Strings aus den Klammern zu bekommen?

„Das Mädchen mit dem Drachen Tattoo (LISBETH)“

und ich brauche nur die Zeichenfolge in den Klammern am Ende der Eingabe zu erhalten .

weit So kam ich zu diesem:

public static void main(String[] args) { 

    Pattern pattern = 
    Pattern.compile("\\({1}([a-zA-Z0-9]*)\\){1}"); 

    Matcher matcher = pattern.matcher("The girl with the dragon tattoo (LISBETH)"); 

    boolean found = false; 
    while (matcher.find()) { 
     System.out.println("I found the text " + matcher.group() 
       + " starting at " + "index " + matcher.start() 
       + " and ending at index " + 
       matcher.end()); 
     found = true; 
    } 
    if (!found) { 
     System.out.println("No match found"); 
    } 
} 

Aber als Ergebnis erhalte ich: (LISBETH).

Wie komme ich von diesen Klammern weg?

Danke!

Antwort

3

Verwendung hinter schauen und nach vorne schauen, dann brauchen Sie nicht zu verwenden/Zugriff auf die Gruppen

Pattern.compile("(?<=\\()[a-zA-Z0-9]*(?=\\))"); 

Diejenigen Blick hinter/vor passen nicht, sie sind nur „Überprüfung“, so dass diejenigen, Klammern sind nicht Teil des Spiels.

+0

+1, aber ist nicht der positive Blick dahinter mit einem Gleichheitszeichen '(? <= \\()'? –

+0

@PetarMinchev natürlich hast du Recht, korrigiert. – stema

+2

Allgemeiner Tipp von mir: * Verwende keine lookarounds wenn es nicht nötig ist. * Es verkompliziert den Ausdruck nicht nur unnötigerweise, sondern es ist auch in manchen Fällen einfach falsch.In diesem Fall wird es gut funktionieren, aber zum Beispiel, wenn Sie nach notierten Substrings suchen, zB '(? <= ") [^"] * (? = ")" Sie würden ungültige Ergebnisse erhalten. In '" foo "bar" baz "' würde es 'foo',' bar 'und' baz' finden. – Qtax

10

Verwenden Sie dieses Muster: \\((.+?)\\) und erhalten dann die Gruppe 1

public static void main(String[] args) { 

    Pattern pattern = Pattern.compile("\\((.+?)\\)"); 
    Matcher matcher = pattern.matcher("The girl with the dragon tattoo (LISBETH)"); 

    boolean found = false; 
    while (matcher.find()) { 
     System.out.println("I found the text " + matcher.group(1) 
       + " starting at " + "index " + matcher.start() 
       + " and ending at index " + 
       matcher.end()); 
     found = true; 
    } 
    if (!found) { 
     System.out.println("No match found"); 
    } 
} 
+0

danke, aber - wieder - ich bekomme (LISBETH). Ich brauche nur LISBETH als Ergebnis. – karla

+0

bist du sicher? Hast du die Datei vor dem Kompilieren gespeichert? Weil ich diese Methode einfach in mein Projekt kopiert habe und es normal funktioniert. – shift66

+0

Verzeihen Sie mir - Ihr Muster hat funktioniert! Danke nochmal! – karla

3

Sie ganz in der Nähe sind, ändern Sie einfach group(), start() und end() Anrufe group(1), start(1) und end(1) da Sie bereits in einem „matching haben Gruppe".

vom api zitiert:

public String-Gruppe()

Gibt die Eingangsfolge durch das vorherige Spiel angepasst.

Und:

public String Gruppe (int-Gruppe)

Gibt die Teilfolge Eingabe durch die gegebene Gruppe während der vorhergehenden Vergleichsoperation erfaßt.

Verwandte Themen