Escape-путь-разделитель в регулярном выражении - PullRequest
11 голосов
/ 28 октября 2008

Мне нужно написать регулярное выражение, которое находит файлы 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 ]

13 голосов
/ 28 октября 2008

Pattern.quote(File.separator) делает трюк?

РЕДАКТИРОВАТЬ: Это доступно с Java 1.5 или более поздней версии. Для версии 1.4 вам нужно просто экранировать символ разделителя файлов:

"\\" + File.separator

Экранирующие знаки препинания ничего не сломают, но экранирование букв или цифр безоговорочно изменит их на особое значение или приведет к PatternSyntaxException . (Спасибо Алану М за то, что указал на это в комментариях!)

5 голосов
/ 28 октября 2008

Есть ли способ использовать общее регулярное выражение, которое работает в системах Windows и UNIX?

Да, просто используйте регулярное выражение, которое соответствует разделителям обоих типов.

pattern = Pattern.compile(
    "^(.+?)" + 
    "[/\\\\]" +
    "js" +
    "[/\\\\]" +
    "(.+?)\\.js$" );

Это безопасно, потому что ни Windows, ни Unix не разрешают эти символы в имени файла или каталога.

2 голосов
/ 28 октября 2008

Разве вы не можете просто использовать обратную косую черту, чтобы выйти из разделителя пути следующим образом:

pattern = Pattern.compile(
     "^(.+?)\\" + 
     File.separator +
     "js\\" +
     File.separator +
     "(.+?).js$" );
1 голос
/ 28 октября 2008

Почему бы тебе не сбежать File.separator:

... +
"\\" + File.separator +
...

чтобы соответствовать Pattern.compile требованиям? Я надеюсь, что "/" (случай Unix) обрабатывается как один "/".

0 голосов
/ 28 октября 2008

Я проверил ответ Гимела в системе Unix - установка "\\" + File.separator работает нормально - полученный "\/" в шаблоне правильно соответствует одному "/"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...