2008-10-28 14 views
11

Tengo que escribir una expresión regular que encuentra archivos javascript que responden aescape separador de ruta en una expresión regular

<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 archivo separador en Windows no está siendo adecuadamente escapó:

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

Lanzar

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

¿Hay alguna manera de utilizar una expresión regular común que funciona tanto en sistemas Windows y UNIX?

Respuesta

12

¿Funciona el Pattern.quote(File.separator)?

EDITAR: Esto está disponible a partir de Java 1.5 o posterior. Para 1.4, es necesario simplemente escapar del carbón separador de archivo:

"\\" + File.separator 

Escapar caracteres de puntuación no rompa nada, pero escapar letras o números sin condiciones, o bien cambiarlos a su significado especial o llevar a un PatternSyntaxException. (! Gracias Alan M por señalar esto en los comentarios)

+0

Genial, qué pena que solo esté disponible desde Java 1.5+ (aún necesito que funcione en 1.4) –

+0

desde Java 7, puede usar 'FileSystems.getDefault(). GetSeparator()' en lugar de 'File. separador' – herau

+0

@herau ¿Hay alguna diferencia? – Tomalak

2

¿No puedes utilizar una barra invertida para escapar del separador de ruta de este modo:

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

¿Por qué no escapar File.separator:

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

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

0

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

5

¿Hay alguna manera de utilizar una expresión regular común que trabaja en ambos sistemas Windows y UNIX?

Sí, simplemente use 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.

+0

Me gusta más esta respuesta, ya que funciona de forma nativa con todo tipo de expresiones regulares tanto en Windows como en Unix. Por ejemplo, en tareas de hormiga donde no hay ayudantes en la respuesta aceptada. –

Cuestiones relacionadas