Разделитель пути экранирования в регулярном выражении
Вопрос
Мне нужно написать регулярное выражение, которое находит файлы javascript, соответствующие
<anypath><slash>js<slash><anything>.js
Например, это должно работать для обоих :
- c:\mysite\js\common.js (Окна)
- /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 ?
Решение
Делает Pattern.quote(File.separator)
проделать этот трюк?
Редактировать:Это доступно начиная с Java 1.5 или более поздней версии.Для версии 1.4 вам нужно просто экранировать разделитель файлов char:
"\\" + File.separator
Экранирование знаков препинания ничего не нарушит, но безусловное экранирование букв или цифр либо изменит их особое значение, либо приведет к Исключение PatternSyntaxException. (Спасибо Алан М за то, что указали на это в комментариях!)
Другие советы
Есть ли какой - нибудь способ использовать общее регулярное выражение , которое работает как в системах 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
работает нормально - результирующий "\/"
в шаблоне правильно соответствует одному "/"