2012-04-03 7 views
3

У меня есть следующая строка:Регулярное выражение, чтобы получить строку из скобок?

«Девушка с татуировкой дракона (Лисбет)»

и мне нужно, чтобы получить только строку в скобках в конце ввода ,

До сих пор я пришел к этому:

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"); 
    } 
} 

Но в результате я получаю: (LISBETH).

Как убежать от этих скобок?

Спасибо!

ответ

3

Используйте оглядываться и смотреть вперед, то вам не нужно использовать/доступ к группам

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

Те оглядывайся/вперед не соответствие, они просто «проверка», так что те, скобки не будут частью матча.

+0

+1, но это не положительный внешний вид с значком равенства '(? <= \\()'? –

+0

@PetarMinchev, конечно, вы правы, исправлены. – stema

+2

Общая подсказка: * Не используйте lookarounds когда вам это не нужно. * Не только это усложняет выражение без необходимости, но и в некоторых случаях это просто неправильно. В этом случае он будет работать нормально, но, например, если вы будете искать найденные подстроки, например '(? <= ") [^"] * (? = ")' вы получите недопустимые результаты. В '' foo "bar" baz "' он найдет 'foo',' bar' и 'baz'. – Qtax

10

Используйте этот шаблон: \\((.+?)\\), а затем получить группу 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

спасибо, но - снова - я получаю (LISBETH). В результате мне нужен только LISBETH. – karla

+0

вы уверены? вы сохранили файл перед компиляцией? Потому что я просто скопировал этот метод в свой проект, и он работает нормально. – shift66

+0

простите меня - ваш узор работал! спасибо, снова! – karla

3

Вы действительно близки, просто изменить group(), start() и end() звонков в group(1), start(1) и end(1), так как у вас уже есть в «соответствии группа».

Цитируется по API:

общественного струнной группы()

Возвращает входной подпоследовательности, совпавшего с предыдущим матчем.

И:

общественной группа Строки (интермедиат группа)

Возвращает входную подпоследовательность, захваченную данной группой во время предыдущей операции сравнения.

Смежные вопросы