Мне интересно, как найти набор всех совпадений с заданным регулярным выражением с конечным числом совпадений.
Например:
Вы можете предположить, что все эти примеры начинаются с ^
и заканчиваются $
`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
Мне также было бы интересно, есть ли способ получить счетчик уникальных решений для регулярного выражения или есть способ определить, имеет ли регулярное выражение конечные решения.
Было бы неплохо, если бы алгоритм мог анализировать любое регулярное выражение, но достаточно мощного подмножества регулярного выражения было бы хорошо.
Меня интересует PHP-решение этой проблемы, но подойдут и другие языки.
РЕДАКТИРОВАТЬ:
В моем классе формальной теории я узнал о DFA, который можно использовать для реализации регулярных выражений. (и другие обычные языки). Если бы я мог преобразовать регулярное выражение в DFA, решение показалось бы мне довольно простым, но это преобразование кажется мне довольно сложным.
РЕДАКТИРОВАТЬ 2:
Спасибо за все предложения, см. Мой пост о публичный проект github, над которым я работаю, чтобы "ответить" на этот вопрос.
/hel+o?/i
соответствует Hello, Hell и Hel. Однако это не то же самое, что поколение. - person tchrist   schedule 30.09.2011All of these example you can assume they start with ^ and end with $
- person Kendall Hopkins   schedule 30.09.2011language agnostic
[т.е. общие решения для каждого языка] илиphp
[решение может и должно использовать инструменты php]. Также: вы предполагаете ascii или unicode? для юникода регулярное выражение...
может быть проблематичным [слишком много возможностей] - person amit   schedule 30.09.2011