Ersetzen Sie das Komma in Klammern mit regex in Java

8

Ich möchte Komma ersetzen, wenn es nur in Klammern steht.

Zum Beispiel

%Vor%

NACH

%Vor%

aber es sollte Komma in der folgenden Zeichenfolge nicht zurückstellen

%Vor%

CODE

Es wird korrekt ersetzt, aber es stimmt nicht überein.

%Vor%

AKTUALISIEREN

String.replaceAll("(,)", " or "); funktioniert nicht, wenn Sie einen String wie diesen haben

String test="Lernen, Sprachen (Java, C #, Perl)";

Sie müssen also @polygeneubricants code

verwenden     
NETQuestion 12.09.2010, 23:42
quelle

4 Antworten

7

Sie können positive Lookahead (?=…) folgendermaßen verwenden:

%Vor%

Dies entspricht einem Komma, aber nur, wenn die erste runde Klammer rechts davon ist.

Das [^…] ist eine negierte Zeichenklasse . [^()] stimmt mit allem außer Klammern überein. Die * ist null oder mehr Wiederholung . Das \) (geschrieben als "\)" als Java-String-Literal) entspricht wörtlich einer schließenden Klammer. Der umgekehrte Schrägstrich entkoppelt, was sonst ein spezielles Metazeichen für Gruppierung ist.

Dies setzt voraus, dass die Eingabezeichenfolge wohlgeformt ist, d. h. Klammern sind immer ausgeglichen und nicht verschachtelt.

    
polygenelubricants 13.09.2010, 00:33
quelle
1

Ihr Fehler verwendet matches anstelle von find hier:

%Vor%

Aus der Dokumentation :

  
  • Die Übereinstimmungsmethode versucht, die gesamte Eingabefolge mit dem Muster abzugleichen.
  •   
  • Die Methode find scannt die Eingabesequenz nach der nächsten Untersequenz, die mit dem Muster übereinstimmt.
  •   

Aber Ihr Code vereinfacht das Problem auch etwas - er ersetzt alle Kommas, auch wenn nur einer von ihnen in Klammern steht. Es ist wahrscheinlich keine gute Idee, reguläre Ausdrücke für diese Art von Aufgabe zu verwenden.

Stattdessen könnten Sie die Zeichenkette ein Zeichen gleichzeitig durchsuchen und zählen, wie viele Paare von Klammern Sie darin sind. Wenn Sie ( sehen, erhöhen Sie die Anzahl und wenn Sie ) sehen, verringern Sie die Anzahl. Wenn Sie , sehen, prüfen Sie, ob die aktuelle Anzahl Null ist.

    
Mark Byers 12.09.2010 23:48
quelle
0

Ein anderer Ansatz ist die Verwendung von positivem Lookahead und positivem Lookbehind in Ihrem regulären Ausdruck. Auf diese Weise können Sie nach Kommas suchen, die nach einem '(', aber vor einem ') auftreten.

(?=X) positiver Lookahead

(?<=X) positives lookbehind

Mark ist korrekt, Sie brauchen eine Schleife anstelle von replaceAll. Aber Sie können immer noch einen regulären Ausdruck mit der beschriebenen Technik verwenden.

    
Jeanne Boyarsky 12.09.2010 23:57
quelle
0
%Vor%

UPDATE : Für String wie "Lernen, Sprachen (Java, C #, Perl)"

%Vor%     
Emil 13.09.2010 06:29
quelle

Tags und Links