Escape path separator в регулярном выражении

Мне нужно написать регулярное выражение, которое находит файлы 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?

Ответ 1

Использует ли Pattern.quote(File.separator) трюк?

EDIT: это доступно с Java 1.5 или новее. Для 1.4 вам нужно просто выйти из разделителя файлов char:

"\\" + File.separator

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

Почему бы вам не выйти File.separator:

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

чтобы соответствовать требованиям Pattern.compile? Я надеюсь, что "/" (случай unix) обрабатывается как одиночный "/".

Ответ 5

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