Mam tablicę słów, które muszę zrobić, aby znaleźć i zastąpić przez operację regex na, a czasami ta tablica może mieć tysiące słów. Przetestowałem i odkryłem, że wymawianie słów przy użyciu wspólnych prefiksów jest znacznie szybsze niż poszukiwanie ich pojedynczo. Oznacza to, że ^where|why$
jest wolniejszy niż ^wh(ere|y)$
. Oczywiście nie jest to zauważalna różnica w tak krótkim przykładzie, ale jest znacznie szybsza, gdy istnieją tysiące alternatyw, a temat jest długi.Jak utworzyć wspólne przedrostki dla słowa wyrażenia regularnego?
Więc szukam sposobu, aby to zrobić wynikającego automatycznie, na przykład konwertować string[] { "what", "why", "where", "when", "which" }
do wh(at|y|e(re|n)|i(ch))
Czy jest już uznanym algorytm tam, że to robi? Jeśli nie, to jak byś to zrobił? Wydaje się, że trzeba to zrobić rekursywnie, ale nie mogę sobie poradzić z tym, jak to zrobić. Mam metodę, którą napisałem, która działa w ograniczonym zakresie, ale jest nieelegancka, ma długość 60 linii i wykorzystuje wiele zagnieżdżonych pętli foreach, więc jest to koszmar dla przyszłych działań konserwacyjnych. Jestem pewien, że jest to znacznie lepszy sposób, jeśli ktoś może wskazać mi w dobrym kierunku, to byłoby bardzo doceniane ...
IIRC jest do tego pakiet * Perl *. A następnie wystarczy przetłumaczyć to na C# ... – kennytm
Nie jestem pewien, czy istnieje biblioteka, która to robi, ale jednym sposobem byłoby załadować słowa do trie, a następnie chodzić to odpowiednio do produkcji regex. http://pl.wikipedia.org/wiki/Trie – Ani