проверить, совпадают ли два регулярных выражения с одинаковыми строками в Java - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть два регулярных выражения (простой пример: «[0-9] +» и «[0123456789] +»). Я хотел бы видеть, соответствуют ли они точно так же входам. Есть ли встроенная функция для выполнения этой проверки в Java? Если нет, то существует ли относительно простой алгоритм выполнения проверки? Спасибо!

Ответы [ 2 ]

6 голосов
/ 11 июня 2013

На самом деле существует алгоритмический способ проверки на равенство регулярных выражений, хотя он сложен. Вот как это сделать:

  1. Конвертируйте оба регулярных выражения в их эквивалентные NFA. Это известный и определенный процесс.
  2. Преобразование обоих NFA в DFA с помощью конструкции powerset.
  3. Учитывая, что пересечение и комплементация замкнуты и хорошо определены для DFA, построить XOR двух DFA. (Это в некоторой степени неправильное использование обозначений, но если автоматы являются A и B, создайте AB '+ A'B)
  4. Эта результирующая машина представляет разницу между исходными регулярными выражениями (любая строка в одной, но не в другой). Теперь просто запустите достижимость графика от начала до конца DFA. Если это не удается, они равны, в случае успеха, не равны!
0 голосов
/ 24 ноября 2011

Во-первых, это точно так же. Во-вторых, я не могу представить встроенную функцию, которая делает то, что вы хотите. Подумайте: вы на самом деле хотите сопоставить регулярное выражение с несколькими входами. Какие входы? Случайные строки? В этом случае вероятность того, что ваша случайная строка содержит только цифры, очень закономерна.

Я могу немного изменить ваш вопрос. Вот моя версия.

* У меня есть 2 регулярных выражения, и я хочу убедиться, что они функционируют одинаково. *

Этот вопрос имеет смысл. В этом случае я могу написать серию модульных тестов, используя одну из популярных платформ модульных тестов (например, JUnit или TestNG), и запустить те же тесты для этих двух регулярных выражений. Я ожидаю одинаковых результатов каждый раз. Но я должен написать строки сам. Например

  • пустая строка
  • строка только с буквами
  • строка только с цифрами
  • строка со специальными символами
  • строка с символами Юникода
  • смесь предыдущих

и т. Д. И т. П.

...