Есть ли способ узнать, эквивалентны ли два произвольных регулярных выражения? Мне кажется сложной проблемой, но может быть какой-то механизм упрощения DFA или что-то еще?Регулярные выражения Эквивалентность
ответ
Для проверки эквивалентности можно вычислить minimal DFAs для выражений и сравнить их ,
Эти два Perlmonks темы обсудить этот вопрос (в частности, прочитать ответы blokhead в):
Испытание равенства является одним из классических свойств регулярных выражений. (NB Это не имеет место, если вы на самом деле говорите о Perl регулярных выражениях или каком-либо других технически нерегулярной superlanguage.)
Превратите УЭ обобщенных конечных автоматов A и B, а затем построить новый автомат АВ такой, что принимающие состояния A имеют нулевые переходы в начальные состояния B и что принимающие состояния B инвертируются. Это дает вам автомат, который принимает все те строки, принятые A, за исключением всех принятых B.
Сделайте то же самое для B-A и уменьшите оба до чистого FA. Если FA не имеет принимающих состояний, доступных из состояния начала, тогда он принимает пустой язык. Если вы можете показать, что оба AB и BA пустые, вы показали, что A = B.
Edit
Хе-хе, не могу поверить, что никто не заметил гигантскую ошибку - конечно, p
Автоматы AB, как описано, будут принимать те струны, первая половина которых принимается A, а вторая половина не принимается B. Построение желательно AB - это немного более сложный процесс. Я не могу думать об этом с ног до головы, но я знаю, что он четко определен (и, вероятно, включает в себя создание состояний для представления продуктов принятия состояний в A и неприемлемых состояний в B).
Для A-B вместо этого вы хотите использовать пересечение и дополнение, которые, к сожалению, не распространены в библиотеках регулярных выражений, хотя они реализуемы для «реальных» регулярных выражений (вместо вида Perl). (И не тестирует, если регулярное выражение ничего не принимает. Библиотеки сосут, не так ли?) –
Это действительно зависит от того, что вы подразумеваете под регулярными выражениями. Как указывали другие плакаты, сокращение обоих выражений до их минимального DFA должно работать, но оно работает только для чистых регулярных выражений.
Некоторые из конструкций, используемых в реальных regex libs реального мира (в частности, обратные ссылки), дают им возможность выражать не регулярные языки, поэтому алгоритм DFA не будет работать для них. Например, регулярное выражение: ([a-z]*) \1
соответствует двойному вхождению одного и того же слова, разделенного пробелом (a a
и b b
, но не b a
, ни a b
). Это вообще не может быть распознано конечным автоматом.
- 1. Регулярные регулярные выражения
- 2. Ориентировочная эквивалентность регулярного выражения
- 3. Эквивалентность цифровой логики выражения
- 4. Регулярные выражения
- 5. Регулярные выражения
- 6. регулярные выражения
- 7. регулярные выражения
- 8. Регулярные выражения
- 9. Регулярные выражения
- 10. Регулярные выражения
- 11. Регулярные выражения
- 12. Регулярные выражения
- 13. Регулярные выражения
- 14. Регулярные выражения?
- 15. Регулярные выражения в VBScript v/s Регулярные выражения в Java
- 16. Регулярные выражения. Это одни и те же регулярные выражения?
- 17. Инструменты, которые превращают регулярные выражения в регулярные выражения?
- 18. Регулярные выражения по URL
- 19. Регулярные выражения - Избежание символов
- 20. PHP + регулярные выражения
- 21. Javascript - инвертирование регулярные выражения
- 22. Регулярные выражения и PHP
- 23. Регулярные выражения/javascript
- 24. Javascript регулярные выражения
- 25. Регулярные выражения в Python
- 26. Регулярные выражения Log4j2
- 27. Регулярные выражения в калькуляторе
- 28. Регулярные выражения проблемы
- 29. JavaScript регулярные выражения
- 30. Регулярные выражения - python
Что вы подразумеваете, сравнивая два DFA? Графический изоморфизм? – damned
Поскольку у вас есть начальное состояние, а переходы обозначены и детерминированы, легко проверить DFA для равенства, намного проще, чем изоморфизм графа. Достаточно одного сквозного прохождения по глубине. – starblue
@starblue Отличная ссылка! – Mooncrater