2012-03-27 2 views
2

문자열에서 "비 정렬"또는 페어링되지 않은 괄호를 모두 제거하려고합니다.자바를 사용하면 언밸런스/비 배열 괄호를 제거합니다.

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

예상 "괄호 균형"문자열이

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

해야 I에 유래에 대한 몇 가지 루비 기반 솔루션을 보았다. 하지만, 내가 자바에서 사용할 수있는 하나를 찾을 수 없습니다. 이 의사 코드에서 할 수있는 방법

+0

예제를 기반으로 기대되는 출력을 확인할 수 있습니까? – assylias

+0

그리고 귀하의 질문은 ... –

답변

4

:

이 실제로 구현 될 수있는 방법을
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

의사 코드와 자바 코드에 대해 고마워. 질문을하기 전에 의사 코드와 비슷한 것을 시도했지만 여러 중첩 괄호와 같은 외곽 조건에 ​​대해서는 무한 루프에서 계속 실행했습니다. 귀하의 자바 코드는 내 오류를 지적하는데 도움이되었습니다. – Watt

+0

관심 상품에 관심이 있으시면 http://stackoverflow.com/questions/9929168/how-to-remove-unbalanced-unpartnered-double-quotes-in-java – Watt

1

이것은 당신의 예에서 제대로 작동 문자열 :

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

또는 더 읽을 수있는 형식 :

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

난 당신이 괄호의 중첩 된 쌍을 허용하지 않으려는 있으리라 믿고있어. 예를 들어,이 문자열 : 당신이 중첩을 허용 할 경우

"abcdef(ghi)jklmno" 

, 아니 순수 정규식 없다 :

"abc(def(ghi)jkl)mno" 

... 첫 ( 마지막 )이 떠나, 제거해야 솔루션 - 적어도 자바에서는 아닙니다.