2010-04-09 7 views
5

tengo esta expresión regular:reemplazar caracteres que no coinciden con los de una expresión regular

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 

puedo comprobar si mi cadena coincide con esta expresión regular y si no, quiero reemplazar todos los caracteres que no están aquí, con "_".

He intentado como:

private static final String SPACE_PATH_REGEX_EXCLUDE = 
     "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 
if (myCompanyName.matches(SPACE_PATH_REGEX)) { 
    myNewCompanySpaceName = myCompanyName; 
} else{ 
    myNewCompanySpaceName = myCompanyName.replaceAll(
      SPACE_PATH_REGEX_EXCLUDE, "_"); 
} 

pero no funciona ..., por lo que en la segunda expresión regular "~" parece no omitir los siguientes caracteres.

¿Alguna idea?

Respuesta

8

Usted tiene varios problemas en su expresión regular (ver el Pattern class de las reglas):

  • dentro de una clase de caracteres | no tiene ningún significado especial y debe ser eliminado sin sustitución en su caso (a menos que usted quiere que su carácter clase para incluir el carácter literal |).
  • De manera similar, no necesita escapar /, _ y + dentro de una clase de caracteres.
  • - sólo tiene que ser de escape, si no es el último carácter
  • ~ además, no tiene un significado especial en una clase de caracteres que sólo se representa
  • tendrá que utilizar ^ para negar el contenido de un grupo de caracteres.

También se puede saltar el primer matches() cheque, como la llamada replaceAll() devolverá una cadena sin modificar si nada se compara con todos modos. Mantenerlo (y la segunda expresión regular) solo sirve para introducir otro lugar donde los errores podrían ocultarse (por ejemplo, podría actualizar accidentalmente una expresión regular, pero no la otra).

+0

Muchas gracias por la clara explicación. –

4

Probar:

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]"; 
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_"); 

El principal problema que tiene es que usted está poniendo innecesarios | s en su patrón. Ellos tienen un significado diferente. Además, puede simplificar enormemente su expresión utilizando \w, que significa "carácter de palabra", es decir, letras (mayúsculas o minúsculas), dígitos o guiones bajos y es sinónimo de [A-Za-z0-9_].

También debe entender cómo funciona el escape. Hay un escape de cadena de Java, por lo que pone \\ para poner una barra invertida en el patrón. Pero también hay escape de expresiones regulares. Por ejemplo, \n es un carácter de nueva línea Java String y \\n es la secuencia para poner \n en un patrón para buscar un carácter de nueva línea.

Usted tiene dos opciones convenientes para escapar de un montón de texto:

  1. Puede utilizar \Q...\E.Se escapó cualquier cosa entre \Q y \E; y

  2. Puede usar Pattern.quote() para citar una cadena arbitraria.

Donde tiene que escapar ciertas secuencias en expresiones regulares es contextual. Por ejemplo, - solo necesita ser escapado si se puede confundir con indicar un rango. [a-z] es un carácter minúsculo. [a\-z] es uno de a, - o z. Pero puede hacer -[a-z] para indicar un guión seguido de una letra minúscula. Nota: no necesita escapar el primer guión.

+0

Creo que necesitas escapar '-' –

Cuestiones relacionadas