как захватить заключенные в скобки группы с помощью регулярных выражений Java - PullRequest
2 голосов
/ 03 декабря 2010

У меня есть строка типа:

(((a * b) + c) * d)

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

Pattern p = Pattern.compile("\\((.*)\\)",Pattern.DOTALL);

будет работать, но это не так.

Что с этим не так?

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

Язык, который вы пытаетесь определить с помощью своего регулярного выражения, к сожалению, пахнет нерегулярно, то есть регулярные выражения не подходят для этого типа выражений.(Точнее, «хорошо сбалансированные круглые скобки» - это не то, что вы можете определить с помощью регулярных выражений.)

Если вы просто хотите найти подстроку a * b в вашем примере, следующие выражения должны сделать:

Pattern p = Pattern.compile("\\(([^()]*)\\)");
Matcher m = p.matcher("(((a * b) * ) + c) * d)");
if (m.find())
    System.out.println(m.group(1));   // prints "a * b"
1 голос
/ 03 декабря 2010

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

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

1 голос
/ 03 декабря 2010

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

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