2013-03-31 3 views
12

Ich möchte Klammern mit Java regulären Ausdruck entfernen, aber ich konfrontiert mit Fehler No group 1 Bitte sehen Sie meinen Code und mir helfen.Entfernen Sie die Klammer aus String mit Java Regex

public String find_parenthesis(String Expr){ 
     String s; 
     String ss; 
     Pattern p = Pattern.compile("\\(.+?\\)"); 
     Matcher m = p.matcher(Expr); 
     if(m.find()){ 
      s = m.group(1); 
      ss = "("+s+")"; 
      Expr = Expr.replaceAll(ss, s); 
      return find_parenthesis(Expr); 
     } 
     else 
      return Expr; 
    } 

und es ist mein Haupt:

public static void main(String args[]){ 
    Calculator c1 = new Calculator(); 
    String s = "(4+5)+6"; 
    System.out.println(s); 
    s = c1.find_parenthesis(s); 
    System.out.println(s); 
} 
+0

Um eine Gruppe zu erfassen, müssen Sie in Ihrer Regex ein Paar nicht umrandete Klammern haben. Angenommen, Sie nehmen diese Änderung vor, aber der Rest des Codes setzt die Klammern wieder ein, nein? –

+0

Warum brauchen Sie Regex dafür? –

+0

@KennethK. Ich brauche es für eine Formel Parsing – Ehsan

Antwort

1

Sie können dies überhaupt mit einem regulären Ausdruck nicht. Es entfernt nicht die passenden Klammern, nur die erste links und die erste rechts, und dann werden Sie nicht in der Lage sein, das korrekte Ergebnis aus dem Ausdruck zu erhalten. Sie benötigen einen Parser für Ausdrücke. Schauen Sie sich rekursive Abstieg ezpresssion Parser, der Dijkstra Rangierbahnhof Algorithmus, etc.

+0

Meine Klammern sind nicht verschachtelt, aber Danke für die Antwort – Ehsan

+0

@Ehsan Wenn Sie die totale Kontrolle über die Eingabe haben, wie Sie sein müssen, um das zu behaupten, Ich verstehe nicht, warum du überhaupt einen Expressionsanalysator brauchst. Auf jeden Fall steht mein Kommentar. Sie benötigen einen Parser für Ausdrücke. Ad-hoc-Methoden funktionieren nicht. Du machst das falsch. Das Problem wird wieder auftauchen, wenn Sie mit der Vorrangstellung des Operators fertig werden. Mach es richtig. Es gibt wirklich keine Alternative. – EJP

+0

Ja, auf jeden Fall ist Ihr Kommentar Parsing mein Weg steht, und ich sage nie, dass in der Formel Parsing ist mein Weg richtig, Aber nur ich Gesicht mit einem Fehler auf Regex und ich frage nach der Lösung – Ehsan

2

Sie erhalten den Fehler, weil Ihre Regex keine Gruppen hat, aber ich schlage vor, Sie verwenden diese viel einfachere, one- Line-Ansatz:

expr = expr.replaceAll("\\((.+?)\\)", "$1"); 
23

die einfachste Methode ist nur alle Klammern aus der Zeichenfolge zu entfernen, und zwar unabhängig davon, ob sie ausgeglichen sind oder nicht.

String replaced = "(4+5)+6".replaceAll("[()]", ""); 

korrekt den Ausgleich Handhabung erfordert (oder wirklich hässlich REs, die nur mit wiederholten regulären Ausdruck Substitutionen zu einer begrenzten Tiefe oder „Klugheit“ entsprechen) Parsen. In den meisten Fällen ist eine solche Komplexität übertrieben; Die einfachste Sache, die möglicherweise funktionieren könnte, ist gut genug.

9

Was Sie wollen, ist dies: s = s.replaceAll("[()]","");

Für mehr auf regex, regex tutorial besuchen.

1

Der reguläre Ausdruck definiert eine Zeichenklasse, bestehend aus einem beliebigen Leerzeichen (\ s, das als \ s maskiert wird, da wir einen String übergeben), einem Bindestrich (escape), weil ein Bindestrich im Kontext von Zeichenklassen) und Klammern. Probieren Sie es aus.

phoneNumber.replaceAll("[\\s\\-()]", ""); 
-1

Ich weiß, ich bin sehr spät hier. Aber für den Fall, dass Sie immer noch nach einer besseren Antwort suchen. Wenn Sie beide öffnen und schließen Klammer aus einem String entfernen möchten, können Sie eine sehr einfache Methode wie folgt verwenden:

String s = "(4+5)+6"; 
s=s.replaceAll("\\(", "").replaceAll("\\)",""); 

Wenn Sie mit diesen:

s=s.replaceAll("()", ""); 

Sie anweist, den Code zu Suchen Sie nach (), die in Ihrer Zeichenfolge nicht vorhanden ist. Stattdessen sollten Sie versuchen, die Klammern getrennt zu entfernen.

Um im Detail betrachtet den Code unten zu erläutern:

String s = "(4+5)+6"; 
String s1=s.replaceAll("\\(", "").replaceAll("\\)",""); 
System.out.println(s1); 
String s2 = s.replaceAll("()", ""); 
System.out.println(s2); 

Die Ausgabe für diesen Code wird sein:

4 + 5 + 6

(4 + 5) + 6

Verwenden Sie auch replaceAll nur, wenn Sie einebenötigen. In anderen Fällen funktioniert replace ganz gut. Siehe unten:

String s = "(4+5)+6"; 
String s1=s.replace("(", "").replace(")",""); 

Ausgang:

4 + 5 + 6

hoffe, das hilft!

Verwandte Themen