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