Разделитель пути экранирования в регулярном выражении

StackOverflow https://stackoverflow.com/questions/242792

  •  04-07-2019
  •  | 
  •  

Вопрос

Мне нужно написать регулярное выражение, которое находит файлы 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 работает нормально - результирующий "\/" в шаблоне правильно соответствует одному "/"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top