Легкий способ преобразования регулярных выражений в 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, как описано выше...