Escape-путь-разделитель в регулярном выражении

Мне нужно написать регулярное выражение, которое находит файлы JavaScript, которые соответствуют

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

Например, он должен работать для обоих:

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

Проблема в том, что разделитель файлов в Windows не экранируется должным образом:

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

Бросание

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

Есть ли способ использовать общее регулярное выражение, которое работает в системах Windows и UNIX?

5 ответов

Решение

Есть ли Pattern.quote(File.separator) сделать трюк?

РЕДАКТИРОВАТЬ: Это доступно с Java 1.5 или более поздней версии. Для версии 1.4 вам нужно просто экранировать символ разделителя файлов:

"\\" + File.separator

Экранирование знаков препинания ничего не нарушит, но безоговорочное экранирование букв или цифр либо изменит их на особое значение, либо приведет к исключению PatternSyntaxException. (Спасибо Alan Moore за то, что указал на это в комментариях!)

Есть ли способ использовать общее регулярное выражение, которое работает в системах Windows и UNIX?

Да, просто используйте регулярное выражение, которое соответствует обоим видам разделителя.

pattern = Pattern.compile(
    "^(.+?)" + 
    "[/\\\\]" +
    "js" +
    "[/\\\\]" +
    "(.+?)\\.js$" );

Это безопасно, потому что ни Windows, ни Unix не разрешают эти символы в имени файла или каталога.

Разве вы не можете просто использовать обратную косую черту для экранирования пути следующим образом:

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

Почему бы тебе не сбежать? File.separator:

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

подходить Pattern.compile требования? Я надеюсь, что "/" (регистр Unix) обрабатывается как один "/".

Я проверил ответ Гимела на систему Unix - "\\" + File.separator отлично работает - в результате "\/" в шаблоне правильно соответствует одному "/"

Другие вопросы по тегам