special pattern online number matches example escape characters java regex escaping

java - pattern - regex symbols



Separador de ruta de escape en una expresión regular (5)

Necesito escribir una expresión regular que encuentre archivos javascript que coincidan

<anypath><slash>js<slash><anything>.js

Por ejemplo, debería funcionar para ambos:

  • c: / mysite / js / common.js (Windows)
  • /var/www/mysite/js/common.js (UNIX)

El problema es que el separador de archivos en Windows no se está escapando correctamente:

pattern = Pattern.compile( "^(.+?)" + File.separator + "js" + File.separator + "(.+?).js$" );

Lanzamiento

java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence

¿Hay alguna forma de usar una expresión regular común que funcione tanto en sistemas Windows como en UNIX?


¿Hay alguna forma de usar una expresión regular común que funcione tanto en sistemas Windows como en UNIX?

Sí, solo usa una expresión regular que coincida con ambos tipos de separador.

pattern = Pattern.compile( "^(.+?)" + "[/////]" + "js" + "[/////]" + "(.+?)//.js$" );

Es seguro porque ni Windows ni Unix permiten esos caracteres en un nombre de archivo o directorio.


¿No puedes usar una barra invertida para escapar del separador de ruta de la siguiente manera:

pattern = Pattern.compile( "^(.+?)//" + File.separator + "js//" + File.separator + "(.+?).js$" );


¿Por qué no File.separator :

... + "//" + File.separator + ...

para ajustarse a los requisitos de Pattern.compile ? Espero que "/" (caso de Unix) se procese como un solo "/".


Probé la respuesta de gimel en un sistema Unix - poniendo "//" + File.separator funciona bien - el "//" resultante en el patrón coincide con un solo "/"


Does Pattern.quote(File.separator) hacer el truco?

EDITAR: Esto está disponible a partir de Java 1.5 o posterior. Para 1.4, simplemente necesita escapar del separador de archivos char:

"//" + File.separator

Los caracteres de puntuación que escapan no romperán nada, pero si se escapan incondicionalmente de las letras o los números, los cambiarán a su significado especial o se traducirán en una excepción PatternSyntaxException . (¡Gracias Alan M por señalar esto en los comentarios!)