Pregunta

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
java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence
quot; );

Lanzar

<*>

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

¿Fue útil?

Solución

¿Hace Pattern.quote (File.separator) hacer el truco?

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

"\\" + File.separator

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

Otros consejos

  

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

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

pattern = Pattern.compile(
    "^(.+?)" + 
    "[/\\\\]" +
    "js" +
    "[/\\\\]" +
    "(.+?)\\.js<*>quot; );

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

¿No puedes usar una barra invertida para escapar del separador de ruta de esta manera?

pattern = Pattern.compile(
     "^(.+?)\\" + 
     File.separator +
     "js\\" +
     File.separator +
     "(.+?).js<*>quot; );

¿Por qué no te escapas de File.separator :

... +
"\\" + File.separator +
...

para cumplir con los requisitos de Pattern.compile ? Espero que " / " (caso de Unix) se procesa como un solo " / " ;.

He probado la respuesta de gimel en un sistema Unix: poner " \\ " + File.separator funciona bien: el " \ / " resultante en el patrón coincide correctamente con un solo "/"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top