Escape Path Separator em uma expressão regular
Pergunta
Preciso escrever uma expressão regular que encontre arquivos JavaScript que correspondem
<anypath><slash>js<slash><anything>.js
Por exemplo, deve funcionar para ambos:
- C: mysite js Common.js (Windows)
- /var/www/mysite/js/common.js (Unix)
O problema é que o separador de arquivos no Windows não está sendo escapado corretamente:
pattern = Pattern.compile(
"^(.+?)" +
File.separator +
"js" +
File.separator +
"(.+?).js$" );
Jogando
java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence
Existe alguma maneira de usar uma expressão regular comum que funcione nos sistemas Windows e Unix?
Solução
Faz Pattern.quote(File.separator)
Faça o truque?
EDIT: Isso está disponível a partir de Java 1.5 ou posterior. Para 1.4, você precisa simplesmente escapar do char do separador de arquivos:
"\\" + File.separator
Os caracteres de pontuação escapar não quebrarão nada, mas escapar letras ou números incondicionalmente os mudará para seu significado especial ou levará a um PatternSyntaxException. (Obrigado Alan m por apontar isso nos comentários!)
Outras dicas
Existe alguma maneira de usar uma expressão regular comum que funcione nos sistemas Windows e Unix?
Sim, basta usar um regex que corresponda aos dois tipos de separador.
pattern = Pattern.compile(
"^(.+?)" +
"[/\\\\]" +
"js" +
"[/\\\\]" +
"(.+?)\\.js$" );
É seguro porque nem o Windows nem o Unix permitem esses caracteres em um nome de arquivo ou diretório.
Você não pode simplesmente usar uma barra de barra para escapar do separador do caminho como assim:
pattern = Pattern.compile(
"^(.+?)\\" +
File.separator +
"js\\" +
File.separator +
"(.+?).js$" );
Por que você não escapa File.separator
:
... +
"\\" + File.separator +
...
caber Pattern.compile
requisitos? Espero que "/" (caso Unix) seja processado como um único "/".
Eu testei a resposta de Gimel em um sistema UNIX - colocando "\\" + File.separator
funciona bem - o resultante "\/"
no padrão corresponde corretamente a um único "/"