Załóżmy, że mam listę wyrażeń regularnych (odczyt z zewnętrznego źródła - pliku, bazy danych itp.). Chcę sprawdzić, który z tych wyrażeń regularnych pasuje do ciągu.Łączenie wielu wyrażeń regularnych w jeden automat
Mogę utworzyć iterację poprzez wszystkie te wyrażenia regularne i dopasować je, ale lista może być ogromna i jest to operacja krytyczna.
Mogę łączyć wszystkie te wyrażenia regularne w jeden (z | między nimi), ale problem polega na tym, że mogę zidentyfikować tylko pierwsze dopasowane wyrażenie regularne, nie wszystkie.
Innym pomysłem może być stworzenie automatu do wszystkich tych wyrażeń regularnych i oznaczenie stanów końcowych za pomocą, powiedzmy, indeksów odpowiedniego wyrażenia regularnego. Patrzyłem na http://cs.au.dk/~amoeller/automaton/, bibliotekę, która wydaje się być zdolna do pracy z wyrażeń regularnych i automatu, ale nie jestem pewien, czy można ją rozszerzyć, aby rozwiązać mój problem.
Czy masz jakieś inne pomysły?
Aby wyjaśnić niektóre komentarze, dodałem przykładowy kod:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternTest {
public static void main(String[] args) {
Pattern p = Pattern.compile("(a(?:b|c)a)|((?:a|b)ba)|(ab(?:a|c))");
Matcher m = p.matcher("aba");
System.out.println(m.matches());
System.out.println(m.groupCount());
for (int i = 0, n = m.groupCount(); i < n; i++) {
System.out.println(m.group(i));
}
}
}
wypisze
true
3
aba
aba
null
Jak widać tylko pierwsza grupa jest dopasowana i nie widzę sposób na dopasowanie dwóch pozostałych.
Więcej wyników - Wykorzystanie powyższej biblioteki automatów sprawi, że problem zmniejszy się do następujących: w przypadku łączenia dwóch lub więcej automatów, w jaki sposób można zidentyfikować końcowy stan odpowiadający oryginalnym automatom?
Czy rozważałeś dodanie nazwanych grup do każdego wyrażenia ed? Możesz sprawdzić, które z nich pasują do tego. –
Te brzmią jak opcje dostępne dla Javy. W Perlu byłoby łatwiej. Możesz po prostu zamiennie wszystkie wyrażenia, a na końcu każdego wyrażenia (zwanego 'X') dodaj na przykład' (? {$ Dopasowane {X} = 1}) (?!) '. Który oznacza wyrażenie "X" jako dopasowane, a następnie kończy się niepowodzeniem, umożliwiając dopasowanie także innych wyrażeń. (Aby ją zoptymalizować, możesz także umieścić każde wyrażenie w grupie przechwytywania atomów.) – Qtax
@ Michael: Tak, również to rozważałem. Problem polega na tym, że wyrażenie regularne w Javie pasuje tylko do pierwszej grupy (nazwanej lub nienazwanej). –