Escludi il separatore di percorso in un'espressione regolare
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 +
"(.+?).jsjava.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?
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 "/"