Próbuję skutecznie wyodrębnić ciągi statyczne (ciągi, które MUST należy dopasować dla danego wyrażenia regularnego do dopasowania). Udało mi się to zrobić w najprostszych przypadkach, ale próbuję odkryć bardziej niezawodne rozwiązanie.Wyodrębnianie ciągów statycznych z wyrażenia regularnego
Biorąc regex takich jak ten poniżej
"fox jump(ed|ing|s)"
dałaby nam
"fox,jumped,jumping,jumps"
Innym przykładem jest
"fox jump(ed|ing|s)?"
co dałoby nam
"fox,jump"
powodu opcjonalnego operatora
Algorytm mam jest zbyt prosta do teraz. Zacznie się od końca wyrażeń regularnych i usunie grupy lub pojedynczy znak, po którym następują te operatory "*?" jak również "eksplodować" zgrupowane operatory OR "(|)". To działa całkiem dobrze, ale nie bierze pod uwagę pełnej składni wyrażenia regularnego. Można to traktować jako rodzaj procesu generowania minimalnego zestawu dla regex (minimalnego zestawu łańcuchów, które regex może "wygenerować/musi pasować").
DLACZEGO? Próbuję dopasować kilka tekstu do dużego zestawu wyrażeń regularnych. Jeśli mogę uzyskać listę "słów kluczowych" dla tych wyrażeń regularnych, które są "wymagane", mogę wykonać szybkie wyszukiwanie tekstowe tego słowa kluczowego, aby filtrować wyrażenia, na których mi zależy (zignoruj te, których nie gwarantuję, że nie pasuję lub nawet pomiń ten tekst całkowicie skutecznie nie uruchamiać żadnych wyrażeń regularnych w tekście, ponieważ jesteśmy zgodni, że nie mamy dopasowania w naszym zestawie wyrażeń regularnych). Mogę zorganizować ten zestaw słów kluczowych w wydajną strukturę danych (Binary Search/Trie/Aho-Corasick), aby filtrować zestaw wyrażeń regularnych, zanim jeszcze spróbuję uruchomić tekst przez Finite Automata. Istnieją niezwykle szybkie algorytmy dopasowywania ciągów znaków, które mogę uruchomić jako etap filtrowania, zanim spróbuję uruchomić wyrażenie regularne. Byłem w stanie zwiększyć przepustowość wielu fałd wykonujących ten prosty proces.
Dlaczego to zrobić? Niektóre tło może przynieść lepsze sposoby na osiągnięcie tego, co próbujesz zrobić. –
dodano trochę tła w DLACZEGO? Sekcja. dzięki! – zer0bit
+1 Wygląda na to, że jest dobrze przemyślany –