Escape separador de ruta en una expresión regular
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 +
"(.+?).jsjava.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?
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 "/"