2012-09-12 13 views
6

Wie alle "" und "" in einer Zeichenfolge mit einem vollständigen Stopp in Java ersetzen? Ich habe versucht auf folgende Weise:Ersetzen Sie alle "(" und ")" in einer Zeichenfolge in Java

String url = "https://bitbucket.org/neeraj_r/url-shortner)"; 
url.replaceAll(")", "."); 
url.replaceAll(")", "."); 

Aber es funktioniert nicht. Der Fehler lautet:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing 
')' 
) 
at java.util.regex.Pattern.error(Unknown Source) 
at java.util.regex.Pattern.compile(Unknown Source) 
at java.util.regex.Pattern.<init>(Unknown Source) 
at java.util.regex.Pattern.compile(Unknown Source) 
at java.lang.String.replaceAll(Unknown Source) 
at com.azzist.cvConversion.server.URLChecker.main(URLChecker.java:32) 

Ich denke, dieses Problem wird auch in allen Regex da sein. Hinzufügen \ vor ) hat nicht funktioniert.

Antwort

13

Sie können replaceAll in einem Rutsch verwenden:

url.replaceAll("[()]", ".") 

Erläuterung:

  • [()] Matches sowohl ( und ), die Klammern müssen nicht in der [] Gruppe maskiert werden.

EDIT (wie von @Keppil darauf hingewiesen):

Beachten Sie auch der String url wird durch die nicht geändert zu ersetzen, ist es nur gibt einen neuen String mit dem Ersatz, so dass Sie zu tun haben würden :

url = url.replaceAll("[()]", "."); 
+0

Danke Beny. Es hat funktioniert – Neeraj

11

Sie benötigen '(' und ')' mit "\\(" und "\\)" zu entkommen jeweils:

url = url.replaceAll("\\)", "."); 
url = url.replaceAll("\\(", ".") 
+0

Es gibt einen kleinen Fehler in Ihrer Antwort. Sie ersetzen nur ")". Aber auch das wird nicht funktionieren. Ihre Logik funktioniert nicht für "(". Url = url.replaceAll ("\\ (", "."); Wird nicht ersetzt "(" – Neeraj

+0

@Neeraj Korrigiert - danke. – munyengm

7

replaceAll() einen regex als ersten Parameter erwartet und Klammern haben dort besondere Bedeutung.

Verwendung replace() statt:

String url = "https://bitbucket.org/neeraj_r/url-shortner)"; 
url = url.replace("(", ".").replace(")", "."); 

Beachten Sie, dass der url = Teil wichtig ist das Ergebnis des Ersatzes zu speichern. Da String s unveränderlich sind, wird das ursprüngliche String nicht geändert, aber ein neues wird erstellt. Um das Ergebnis zu halten, muss url stattdessen auf dieses verweisen.

+0

Beide 'url.replace ("(" , ".") und url.replaceAll ("\\ (", ".") funktionieren einwandfrei. Der Punkt hier ist "url = url.replace (...)". In der Frage der "url = ... msgstr " –

+1

@emempe: Ja, das war auch wichtig, aber der Fehler im OP - Beispiel war auf einen Regex - Fehler zurückzuführen. Ich füge eine Notiz über die 'url =' hinzu 'Teil auch. – Keppil

+0

@Keppil Ich möchte alle konvertieren" ("in der Zeichenfolge. Mit .replace, ich denke, ich kann nur das erste Vorkommen konvertieren. – Neeraj

1

Hinzufügen eines einzigen \ wird nicht funktionieren, weil das \) als ein escaped Sonderzeichen auswerten wird, die es nicht ist.

Sie müssen "\)" verwenden. Das erste \ entkommt dem zweiten und erzeugt ein "normales" \, das seinerseits dem ) entgeht und einen Regex erzeugt, der genau einer schließenden Paranthese ) entspricht.

Die allgemeine Lösung ist Pattern.quote, die eine beliebige Zeichenfolge verwendet und eine Regex zurückgibt, die genau dieser Zeichenfolge entspricht.

0

Methode String#replaceAll einen regulären Ausdruck und ( sowie ) sind Sonderzeichen (Markierung der Gruppe) erwartet, so müssen Sie sie entkommen sein, nicht-Sonder url.replaceAll("\\)", ".");.

Sie können auch beide Zeichen auf einmal mit Muster url.replaceAll("[()]", "."); ersetzen. Sie können sehen, dass in diesem Kontext die Klammern nicht maskiert sind. Das liegt am regEx-Kontext - innerhalb von [] haben sie keine besondere Bedeutung.

Betrachten Sie JavaDoc für weitere Informationen.

0

Weil ) Zeichen von Regex ist, so müssen Sie es entkommen. Versuchen Sie folgendes:

url.replaceAll("\)", "\."); 
0

Verwenden

url.replaceAll("\\)", ".").replaceAll("\\(", ".");; 
2
  1. String ist unveränderlich.
  2. ) sollte mit 2 Backslashes maskiert werden.

So würde der Code wie folgt aussehen:

String url = "https://bitbucket.org/neeraj_r/url-shortner)"; 
// is you need to escape all of them, use "[()]" pattern, instead of "\\)" 
String s = url.replaceAll("\\)", "."); 
System.out.println(url); 
System.out.println(s); 

Und die Ausgabe:

https://bitbucket.org/neeraj_r/url-shortner) 
https://bitbucket.org/neeraj_r/url-shortner. 
1

Sie könnten auch org.apache.commons.lang.StringUtils.replace verwenden (String, String, String), der keine Regex verwendet

Von Apache Commons Bibliothek http://commons.apache.org/

Verwandte Themen