2012-03-27 4 views
2

Ich möchte alle "unpartered" oder nicht paaren Klammern aus einer Zeichenfolge entfernen.Verwenden von Java entfernen Sie unsymmetrische/unpartered Klammern

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

Die erwartete "Klammer ausgeglichen" string

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

sein sollte, sah ich einige Rubin basierte Lösung auf Stackoverflow. Aber, konnte ich keinen finden, den ich in Java verwenden kann.

+0

Können Sie anhand Ihres Beispiels die erwartete Ausgabe bestätigen? – assylias

+0

Und Ihre Frage ist ... –

Antwort

4

Wie könnte es in Pseudo-Code erfolgen:

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 

Wie es in der Praxis umgesetzt werden könnte: http://ideone.com/K3s0X

Beispieler:

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

Vielen Dank für den Pseudocode und den Java-Code. Bevor ich die Frage gestellt habe, habe ich etwas Ähnliches wie deinen Pseudo-Code versucht, aber ich lief immer in einer Endlosschleife für einige Randbedingungen wie mehrere verschachtelte Klammern. Ihr Java-Code war sehr hilfreich, um meinen Fehler anzuzeigen. – Watt

+0

Dachte das könnte Sie interessieren http://stackoverflow.com/questions/9929168/how-to-remove-unbalanced-unpartnered-double-quotes-in-java – Watt

1

Dies funktioniert korrekt auf Ihrem Beispiel Zeichenkette:

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

Oder:

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

Ich nehme an, Sie nicht verschachtelte Paare von Klammern erlauben wollen. Zum Beispiel in dieser Zeichenfolge:

"abc(def(ghi)jkl)mno" 

... die ersten ( und die letzten ) entfernt werden soll, diese zu verlassen:

"abcdef(ghi)jklmno" 

Wenn Sie nisten zulassen mögen, gibt es keine reine regex Lösung - zumindest nicht in Java.