Jeśli wyrażenia regularne używają "zaawansowanych funkcji" typowych masek procesowych (takich jak w językach Perl, Java, Python, Ruby itp.), Które umożliwiają akceptowanie języków, które nie są regularne, oznacza to, że nie masz szczęścia. Problem jest ogólnie nierozstrzygalny. Na przykład. problem polegający na tym, czy jeden automat wrzutowy rozpoznaje ten sam język wolny od kontekstu (CF), co inny, który jest nierozstrzygalny. Rozszerzone wyrażenia regularne mogą opisywać języki CF.
Z drugiej strony, jeśli wyrażenia regularne są "prawdziwe" w sensie teoretycznym, składające się tylko z konkatenacji, naprzemienności i gwiazdy Kleene nad ciągami z skończonym alfabetem oraz zwykłym cukrem syntaktycznym na tych (klasach znaków, +,?, itp.), to jest prosty algorytm wielomianowy.
nie mogę dać ci biblioteki, ale w ten sposób:
For each pair of regexes r and s for languages L(r) and L(s)
Find the corresponding Deterministic Finite Automata M(r) and M(s)
Compute the cross-product machine M(r x s) and assign accepting states
so that it computes L(r) - L(s)
Use a DFS or BFS of the the M(r x s) transition table to see if any
accepting state can be reached from the start state
If no, you can eliminate s because L(s) is a subset of L(r).
Reassign accepting states so that M(r x s) computes L(s) - L(r)
Repeat the steps above to see if it's possible to eliminate r
Konwersja regex do DFA generalnie wykorzystuje konstrukcję Thompson dostać zakaz deterministyczny automat. Zostanie to przekonwertowane na DFA przy użyciu konstrukcji podzestawu. Maszyna międzyplatformowa jest innym standardowym algorytmem.
Wszystko to zostało opracowane w latach 60. XX wieku i jest obecnie częścią każdego dobrego kursu teoretycznego z zakresu informatyki. Złotym standardem dla tego tematu jest Hopcroft and Ullman, Automata Theory.
Nie do końca jestem pewien, czy rozumiem - czy mówisz, że masz dwa wyrażenia regularne, 'a.c *' i 'abc *'? I nie chcesz rozszyfrować, czy są one takie same, czy częściowo takie same? Czy też 'a.c * ⊃ abc *' całe wyrażenie regularne? Jak nigdy przedtem nie widziałem tej notacji, zanim – SmokeyPHP
strict oznacza ścisły nadzbiór, prawdopodobnie powinienem był użyć ⊇, który jest bardziej powszechny. Próbuję powiedzieć, że każdy ciąg zaakceptowany przez 'abc *' jest również akceptowany przez 'a.c *' –
Jaka jest twoja definicja Regex? W większości języków programowania, składnia wyrażeń regularnych, która często umożliwia odsyłacze wstecz, jest silniejsza niż zwykłe języki. Tak więc rozstrzygalność włączenia nie jest nawet jasna ... –