Мне интересно, как найти набор всех совпадений с заданным регулярным выражением с конечным числом совпадений.
Например:
Во всех этих примерах вы можете предположить, что они начинаются с ^
и заканчиваются на $
`hello?` -> (hell, hello)
`[1-9][0-9]{0,3}` -> (1,2,3 ..., 9998, 9999)
`My (cat|dog) is awesome!` -> (My cat is awesome!, My dog is awesome!)
`1{1,10}` -> (1,11, ..., 111111111, 1111111111)
`1*` -> //error
`1+` -> //error
`(1|11){2}` -> (1,11,111,1111) //notice how it doesn't repeat any of the possibilities
Мне также было бы интересно, если бы был способ получения count уникальных решений для регулярного выражения или если есть способ определить, имеет ли регулярное выражение конечные решения.
Было бы неплохо, если бы алгоритм мог анализировать любое регулярное выражение, но достаточно мощное подмножество регулярного выражения было бы хорошо.
Меня интересует решение PHP для этой проблемы, но другие языки также будут в порядке.
EDIT:
Я узнал в своем классе Formal Theory о DFA, который можно использовать для реализации регулярных выражений (и других регулярных языков). Если бы я мог преобразовать регулярное выражение в DFA, то решение кажется мне довольно прямым, но это преобразование кажется мне довольно сложным.
ИЗМЕНИТЬ 2:
Спасибо за все предложения, см. мой пост о публичном проекте github. Я работаю над тем, чтобы "ответить" на этот вопрос.