Легкий способ преобразования регулярных выражений в java-совместимое регулярное выражение?
У меня есть регулярное выражение, определенное в Python/Ruby/PHP, подобное
"(forumdisplay.php\?.*page=%CURRENTPAGE%)"
Когда я делаю это для Java, мне нужно удвоить escape вопросительный знак до \\?
Так же:
"(forumdisplay.php\\?.*page=%CURRENTPAGE%)";
Есть ли функция, которую я могу использовать для этого автоматически? Или мне нужно будет изменить все мои регулярные выражения для работы с ядром Java regex?
Ответы
Ответ 1
Попробуйте воспользоваться этим онлайн-инструментом: http://www.regexplanet.com/advanced/java/index.html
Он принимает ваше нормальное регулярное выражение и выводит java-совместимое строковое выражение. Сэкономил мне много времени, превращая огромные строки регулярных выражений.
Обратите внимание, что не все выражения регулярных выражений работают в java. Я видел странное регулярное выражение проверки php, которое просто ведет себя по-разному в сопоставлении java-шаблонов.
Ответ 2
Обратите внимание, что это не механизм регулярных выражений Java, который требует двойных обратных косых черт, а компилятор Java. Когда вы пишете следующее в исходном коде Java:
"(forumdisplay.php\\?.*page=%CURRENTPAGE%)"
компилятор Java интерпретирует это как строку:
(forumdisplay.php\?.*page=%CURRENTPAGE%)
Механизм регулярного выражения Java выполняет то же самое, что и другие механизмы регулярных выражений - знак вопроса (потому что он экранирован) обрабатывается буквально.
Аналогичная ситуация происходит и в Python - две строки ниже идентичны:
r"(forumdisplay.php\?.*page=%CURRENTPAGE%)"
"(forumdisplay.php\\?.*page=%CURRENTPAGE%)"
Это использует нотацию Python r
для строки "raw", где обратная косая черта не интерпретируется компилятором.
Ответ 3
Лично я использую в Eclipse EXCELLENT плагины с сайта http://www.bastian-bergerhoff.com/eclipse/features/
Вы найдете там QuickREx для регулярного выражения, а также плагин XPath developper, который я использую много.
Для QuickREx просто проверьте свое регулярное выражение и нажмите кнопку, чтобы скопировать его в активном редакторе с хорошими символами экранов.
Это необходимо, просто попробуйте.
Ответ 4
Хорошим началом обычно является просто "найти замену всех" "\" на "\\".
На самом деле вы не делаете никаких изменений, чтобы выполнить эту работу с движком java regex. Вам просто нужно иметь дело с проблемами хранения регулярного выражения в Java String... Вы можете сделать это в функции, но это сделает больше кода для поддержки. Я бы предложил сделать замену find, как описано выше...