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?

Foi útil?

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 "/"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top