Zastanawiam się, jak znaleźć zestaw wszystkich dopasowań do danego wyrażenia regularnego ze skończoną liczbą dopasowań.Utwórz zestaw wszystkich możliwych dopasowań dla danego regex
Na przykład:
Wszystkie te przykład można założyć, że zaczynają się i kończą ^
$
`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
Byłbym również zainteresowany, czy nie było sposobem na zdobycie count unikalne rozwiązanie do wyrażenia regularnego lub jeśli istnieje sposób na określenie, czy regex ma skończone rozwiązania.
Byłoby miło, gdyby algorytm mógł przeanalizować dowolny regex, ale wystarczająco silny podzbiór regex byłby w porządku.
Jestem zainteresowany rozwiązaniem PHP dla tego problemu, ale inne języki również byłyby w porządku.
EDIT:
nauczyłem się w moim formalnej teorii klasie o DFA które mogą być wykorzystane do wdrożenia regex (i innych języków regularnych). Jeśli mógłbym przekształcić wyrażenie regularne w DFA, rozwiązanie wydaje mi się dość proste, ale ta transformacja wydaje mi się trudna.
EDIT 2:
Dzięki za wszystkie sugestie, see my post about the public github project pracuję na "odpowiedź" na to pytanie.
Świetne pytanie. Wyobrażam sobie, że coś, co mogłoby to zrobić, byłoby bardzo użyteczne w testach jednostkowych. – FtDRbwLXw6
@drrcknlsn To była jedna z moich myśli, myślałem o użyciu jej do wygenerowania pełnej pamięci podręcznej dla systemu routingu opartego na regex dla MVC. –
Zakładasz ukryte kotwice. Łatwo jest pokazać wszystkie możliwe sposoby dopasowania danego ciągu. Na przykład, biorąc pod uwagę "Witaj świecie", wzorzec '/ hel + o?/I" pasuje do Hello, Hell i Hel. To jednak nie to samo co pokolenie. – tchrist