Обнаружение конфликтов регулярных выражений


Предположим, что два регулярных выражения e1 и e2 столкнитесь, если существует какая-либо строка s, такая, что оба e1 и e2 совпадают s.

Существует ли какой-либо простой (эффективный) способ проверить, сталкиваются ли два регулярных выражения без перебора набора всех возможных строк в нашем словаре?

Примечание 1: Я не знаю, называется ли это как-то по-другому в литературе. Может быть, мне просто не хватает подходящего имени для поиска это.

Примечание 2: Идеальным ответом для меня является написанный PHP-код, но я принимаю любое предложение, не обязательно PHP.

Author: NublicPablo, 2014-11-17

1 answers

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

Это возможно, и, по-видимому, это несложно реализовать, но, похоже, официальной поддержки PHP нет.

Ключ к реализации простого алгоритма основан на переводе регулярных выражений в конечный автомат. Прочитайте прикрепленные ссылки, чтобы лучше понять решение.

Связанный с переполнением стека вопросы:

Пересечение двух регулярных выражений

Вычислите, не пересекаются ли два бесконечных набора решений регулярных выражений

Неофициальная библиотека для PHP:

Https://github.com/KendallHopkins/FormalTheory

Редактировать: Добавление фрагмента кода для проверки пересечений с использованием библиотеки Кендалла Хопкинса:

function doRegexIntersection($regex_string_1, $regex_string_2) {
    $lexer = new FormalTheory_RegularExpression_Lexer();
    $nfa1 = $lexer->lex( $regex_string_1 )->getNFA();
    $nfa2 = $lexer->lex( $regex_string_2 )->getNFA();
    return FormalTheory_FiniteAutomata::intersection( $nfa1, $nfa2 )->validSolutionExists();
}
 1
Author: NublicPablo, 2017-05-23 11:51:41