2012-09-12 9 views
6

¿Cómo reemplazar todo "(" y ")" en una cadena con una tapa completa, en Java? Intenté de la siguiente manera:Reemplazar todo "(" y ")" en una cadena en Java

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

Pero no funciona. El error es:

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) 

Creo que este problema estará presente en todas las expresiones regulares también. Agregar \ antes de ) no funcionó.

Respuesta

13

Puede utilizar replaceAll de una sola vez:

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

Explicación:

  • [()] partidos tanto ( y ), los soportes no necesitan ser escapado dentro del grupo [].

EDITAR (como ha señalado @Keppil):

Tenga en cuenta también, la cadena url no se cambia por la sustitución, simplemente devuelve una nueva cadena con los reemplazos, por lo que tendría que hacer :

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

Gracias, Beny. – Neeraj

11

tiene que escapar '(' y ')' con "\\(" y "\\)" respectivamente:

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

Hay un pequeño error en su respuesta. Usted solo está reemplazando ")". Pero también esto no funcionará. Su lógica no funcionará para "(". Url = url.replaceAll ("\\ (", "."); No reemplazará "(" – Neeraj

+0

@Neeraj corregido - gracias. – munyengm

7

replaceAll() espera un regex como primer parámetro, y los paréntesis tienen un significado especial allí.

uso replace() lugar:

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

Tenga en cuenta que la parte url = es importante guardar el resultado de la sustitución. Dado que String s son inmutables, el original String no se cambia, pero se crea uno nuevo. Para mantener el resultado url necesita apuntar a este en su lugar.

+0

Ambos 'url.replace ("(" , ".") y url.replaceAll ("\\ (", ".") funcionan bien. El punto aquí es "url = url.replace (...)". En la pregunta, "url = ... "faltaba. Por lo tanto, la cadena será reemplazada pero no escrita en algún lugar. –

+1

@emempe: Sí, eso también fue importante, pero el error en el ejemplo de OP se debió a un error de expresión regular. Agregaré una nota sobre el' url = 'también parte – Keppil

+0

@Keppil Quiero convertir todo el" ("en el String. Al usar .replace, creo que puedo convertir solo la primera ocurrencia. – Neeraj

1

Agregar un solo \ no funcionará, porque intentará evaluar \) como un carácter especial escapado que no lo es.

Tendrá que utilizar "\)". El primer \ escapa del segundo, produciendo un \ "normal", que a su vez escapa al ), produciendo una expresión regular que coincide exactamente con una parátesis de cierre ).

La solución de propósito general es usar Pattern.quote, que toma una cadena arbitraria y devuelve una expresión regular que coincide exactamente con esa cadena.

0

Método String#replaceAll espera una expresión regular y (, así como ) son caracteres especiales (que marca el grupo) por lo que necesita para escapar de ellos a ser no url.replaceAll("\\)", "."); especial.

También puede reemplazar ambos caracteres a la vez con el patrón url.replaceAll("[()]", ".");. Puedes ver que en este contexto los corchetes no se escapan. Esto se debe al contexto de regEx: dentro de [] no tienen ningún significado especial.

Consulte JavaDoc para obtener más información.

0

Porque ) es el carácter de regex, por lo que debe escaparse. Prueba esto:

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

Uso

url.replaceAll("\\)", ".").replaceAll("\\(", ".");; 
2
  1. cadena es inmutable.
  2. ) debe escapar con 2 barras diagonales inversas.

Así que el código se vería así:

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); 

Y la salida:

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

También es posible usar org.apache.commons.lang.StringUtils.replace (String, String, String) que no usa regex

De la biblioteca de apache commons http://commons.apache.org/

Cuestiones relacionadas