2012-03-27 5 views
2

文字列からすべての "未対応"またはペアなしのかっこを削除します。Javaを使用するアンバランス/アンパナー付きのかっこを削除します。

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

期待される "カッコバランス" の文字列は、私はstackoverflowの上でいくつかのルビーベースのソリューションを見た

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

でなければなりません。しかし、私はjavaで使用できるものを見つけることができませんでした。

それは実際に実装される可能性がありますどのように
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 

:それは擬似コードで実行される可能性がありますどのように

+0

あなたの例に基づいて予想される出力を確認できますか? – assylias

+0

あなたの質問は... –

答えて

4

http://ideone.com/K3s0X

サンプル結果:

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

擬似コードとJavaコードに感謝します。質問をする前に、擬似コードに似たものを試していましたが、複数のネストされた括弧のようないくつかの外来条件に対して無限ループで動作し続けました。あなたのJavaコードは、私のエラーを指摘するのに役立ちました。 – 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 

私はあなたが括弧のネストされたペアを許可しないと仮定しています。たとえば、この文字列で:

"abc(def(ghi)jkl)mno" 

... (最初と最後)がこれを残して、削除する必要があります。

"abcdef(ghi)jklmno" 

あなたはネストできるようにしたいならば、何も純粋な正規表現はありません解決策 - 少なくとも、Javaではありません。

関連する問題