Использование Java удаляет несбалансированные / непаренные скобки - PullRequest
2 голосов
/ 28 марта 2012

Я хочу удалить все «непаренные» или непарные скобки из строки.

exampleStr = back-pay) zyzhk1219(17) zyzhk1329 zyzhk1595(15) zyzhk1988 zyzhk2004 zyzhk2131) jswioj((testsjkldf

Ожидаемая строка со сбалансированными скобками должна быть

back-pay zyzhk1219(17) zyzhk1329 zyzhk1595(15) zyzhk1988 zyzhk2004 zyzhk2131 jswiojtestsjkldf

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

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

Как это можно сделать в псевдокоде:

initialize parenLevel = 0
for each character in string
    if char is ( increment parenLevel
    if char is )
        if parenLevel = 0, remove bad paren
        else, decrement parenLevel
next

initialize parenLevel = 0
for each character in string in reverse
    if char is ) increment parenLevel
    if char is (
        if parenLevel = 0, remove bad paren
        else, decrement parenLevel
next

Как это может быть реализовано на практике: http://ideone.com/K3s0X

Пример результата:

back-pay zyzhk1219(17) zyzhk1329 zyzhk1595(15) zyzhk1988 zyzhk2004 zyzhk2131 jswiojtestsjkldf
1 голос
/ 28 марта 2012

Это правильно работает в вашем примере строки:

s = s.replaceAll("([^()]*(?:\\([^()]*\\)[^()]*)*)[()]", "$1");

Или, в более читаемой форме:

(
  [^()]*          # some non-parentheses
  (?:
    \([^()]*\)    # a matched pair of parens
    [^()]*        # some more non-parens
  )*
)
[()]              # one unpaired paren

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

"abc(def(ghi)jkl)mno"

... первый ( и последний ) должны быть удалены, оставляя это:

"abcdef(ghi)jklmno"

Если вы хотитечтобы разрешить вложение, не существует чистого решения регулярных выражений - по крайней мере, не в Java.

...