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
работает нормально - результирующий "\/"
в шаблоне корректно соответствует одиночному "/"