2016-05-10 2 views
0

Я использую Java, и я хотел бы реализовать код, выход которого PRP I, когда вход (NP (PRP I)). Моя текущая реализация, как следующее:Как получить только вложенную скобку в regex

Pattern pattern = Pattern.compile("\\((.?)\\)"); 
Matcher matcher = pattern.matcher(noun_phrase); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

и его выход NP (PRP I.

Я знаю, что одной возможностью было бы считать круглые скобки, но мне интересно, есть ли способ получить только строку внутри вложенных круглых скобок, используя regex.

+0

Если вам нужен только самый внутренний уровень, попробуйте '\\ (([^()] *) \\)'. Проверьте [regex101] (https://regex101.com/r/hO4bN7/1). – ClasG

+0

Regex в Java - это не решетка с вложенными структурами, поскольку она не поддерживает рекурсию. Также решение будет зависеть от возможной структуры вашего ввода. Поэтому нам нужно знать, может ли он иметь более вложенные круглые скобки, такие как '(a (b (c (d) e) f) g)'. Если да, то что должно быть результатом? – Pshemo

+0

@Pshemo это может иметь дело с фиксированной глубиной гнездования. –

ответ

0

Это должно работать

Pattern pattern = Pattern.compile("\\(.*?\\((.*?)\\)\\)"); 
Matcher matcher = pattern.matcher("(NP (PRP I))"); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

Вы можете использовать следующие сайты поэкспериментировать с регулярными выражениями.

https://regex101.com/r/cE0dM7/1

http://leaverou.github.io/regexplained/

https://www.debuggex.com/r/gfVglXkY1Cw5D6Mb

0

Вам нужно добавить еще фигурные скобки вокруг группы. Кроме того, вы должны убедиться, что между неподвижными скобки не совпадают круглые скобки:

String noun_phrase = "(NP (PRP I))"; 
    Pattern pattern = Pattern.compile("\\([^(]*\\(([^)]*)\\)[^)]*\\)"); 
    Matcher matcher = pattern.matcher(noun_phrase); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } 

инверсных символьные классы [^(] и [^)] убедитесь, что вы не подходите круглые скобки слишком охотно.

0

Ну, поскольку я не знаю, как глубоко вы можете перейти со своими скобками, я предложу два возможных решения.

Решение 1: Предполагая глубину точно так же, как в вашем вопросе.

Это регулярное выражение будет работать: Pattern pattern = Pattern.compile("\\(([^()]*)\\)").

Решение 2: Предполагая, что глубина произвольная (но по крайней мере самая внутренняя строка окружена скобками).

В этом случае вам придется внести дополнительные изменения. Во-первых, ваш шаблон будет выглядеть так: Pattern pattern = Pattern.compile("(\\(.*)*\\(([^)]*)\\)"). Увидеть разницу? Теперь у вас есть две группы: первое совпадение на всех, кроме самой внутренней части, окруженной скобками, вторая группа - именно та, которую вы хотите. Это означает, что в вашей петле вы должны изменить matcher.group(1) на matcher.group(2). Кроме того, [^)] гарантирует, что у вас нет закрывающих скобок в вашей группе.

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