Мне нужно написать регулярное выражение, которое находит файлы javascript, соответствующие
<anypath><slash>js<slash><anything>.js
Например, он должен работать для обоих:
Проблема в том, что разделитель файлов в 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 вам нужно просто экранировать символ разделителя файлов:
"\\" + File.separator
Экранирование знаков препинания ничего не сломает, но экранирование букв или цифр безоговорочно либо изменит их на их особое значение, либо приведет к PatternSyntaxException. (Спасибо Алан М за указание на это в комментариях!)
начиная с Java 7, вы можете использовать FileSystems.getDefault().getSeparator() вместо File.separator
@herau Есть разница?
@Tomalak В случае поставщика по умолчанию этот метод возвращает тот же разделитель, что и File.separator. Однако это может быть полезно, когда вы работаете с другим провайдером.
Разве вы не можете просто использовать обратную косую черту, чтобы избежать разделителя пути, например:
pattern = Pattern.compile(
"^(.+?)\\" +
File.separator +
"js\\" +
File.separator +
"(.+?).js$" );
Почему бы тебе не сбежать от File.separator:
... +
"\\" + File.separator +
...
чтобы соответствовать требованиям Pattern.compile?
Я надеюсь, что «/» (случай unix) обрабатывается как одиночный «/».
Я протестировал ответ gimel в системе Unix - установка "\\" + File.separator работает нормально - полученный "/" в шаблоне правильно соответствует одному "/"
Is there any way to use a common regular expression that works in both Windows and UNIX systems ?
Да, просто используйте регулярное выражение, которое соответствует обоим типам разделителей.
pattern = Pattern.compile(
"^(.+?)" +
"[/\\\\]" +
"js" +
"[/\\\\]" +
"(.+?)\\.js$" );
Это безопасно, потому что ни Windows, ни Unix не допускают использование этих символов в имени файла или каталога.
Мне этот ответ больше нравится, поскольку он изначально работает со всеми типами регулярных выражений как в Windows, так и в UNIX. Например, в задачах с муравьями, где у вас нет помощников, как в принятом ответе.
На самом деле, я думаю, что Linux не будет проблем с «посреди имени файла или каталога» (и не будет интерпретировать его как имеющее какое-либо отношение к каталогам); это некоторые комбинации пользователи и файловые системы запрещают это, AFAIK. (я определенно не хочет никаких файлов или каталогов с такими именами.)
Отлично, как жаль, что он доступен только с Java 1.5+ (мне все еще нужно, чтобы он работал в 1.4)