Domanda

Devo scrivere un'espressione regolare che trova i file javascript che corrispondono

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

Ad esempio, dovrebbe funzionare per entrambi:

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

Il problema è che il separatore di file in Windows non è stato salvato correttamente:

pattern = Pattern.compile(
     "^(.+?)" + 
     File.separator +
     "js" +
     File.separator +
     "(.+?).js
java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence
quot; );

Lancio

<*>

Esiste un modo per usare un'espressione regolare comune che funziona sia nei sistemi Windows che UNIX?

È stato utile?

Soluzione

Pattern.quote (File.separator) fa il trucco?

EDIT: disponibile da Java 1.5 o successive. Per 1.4, devi semplicemente sfuggire al carattere separatore di file:

"\\" + File.separator

La fuga dei caratteri di punteggiatura non romperà nulla, ma la fuga incondizionata di lettere o numeri li modificherà nel loro significato speciale o porterà a PatternSyntaxException . (Grazie Alan M per averlo sottolineato nei commenti!)

Altri suggerimenti

  

Esiste un modo per usare un'espressione regolare comune che funziona sia nei sistemi Windows che UNIX?

Sì, usa solo una regex che corrisponde a entrambi i tipi di separatore.

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

È sicuro perché né Windows né Unix consentono quei caratteri in un nome di file o directory.

Non puoi semplicemente usare una barra rovesciata per sfuggire al separatore di percorso in questo modo:

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

Perché non esci da File.separator :

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

per soddisfare i requisiti Pattern.compile ? Spero che " / " (caso unix) viene elaborato come un singolo " / " ;.

Ho testato la risposta di gimel su un sistema Unix - mettendo " \\ " + File.separator funziona bene - il " \ / " risultante nel modello corrisponde correttamente a un singolo "/"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top