2010-01-09 13 views
20

En mi programa cuando estoy usandoPatrón de encordado problema de la concordancia en Java

line.replaceAll("(", "_"); 

Tengo una RuntimeException:

at java.util.regex.Pattern.error(Unknown Source) 
at java.util.regex.Pattern.accept(Unknown Source) 
at java.util.regex.Pattern.group0(Unknown Source) 
at java.util.regex.Pattern.sequence(Unknown Source) 
at java.util.regex.Pattern.expr(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 Processing.processEarly(Processing.java:95) 
at Processing.main(Processing.java:34) 

¿Hay alguna razón? ¿Cómo podemos evitarlo?

Respuesta

37

El primer argumento para string.replaceAll es una expresión regular, no solo una cadena. El corchete de apertura a la izquierda es un carácter especial en una expresión regular, por lo que debe escapar de ella:

line.replaceAll("\\(", "_"); 

alternativa, puesto que va a sustituir un solo carácter, se puede utilizar string.replace así:

line.replace('(', '_'); 
+0

Gracias por la edición Laurence! D'oh! –

+5

'String.replace' también se puede usar para reemplazo literal (no regex). – McDowell

+0

Gracias - agregado a la respuesta. –

2

la mensaje de error por encima de la traza de la pila es (un poco) útil:

Excepción en hilo "principal" java.util.regex.PatternSyntaxException: Uncl grupo osed cerca de índice 1 ( ^

(Eso es lo que me pasa en Java 6.) Se habla de "expresiones regulares", "grupo", y el paréntesis. Si no puede ver este mensaje, debe verificar cómo está registrando/capturando/mostrando excepciones. Podría ahorrarle algunos problemas en el futuro.

+0

+1 para enseñar a pescar. – trashgod

Cuestiones relacionadas