Ich habe ein Array von Wörtern, die ich durch Regex-Operation suchen und ersetzen muss, und manchmal kann dieses Array Tausende von Wörtern lang sein. Ich habe getestet und gefunden, dass das Stempeln der Wörter mit gemeinsamen Präfixen viel schneller ist, als nach ihnen einzeln zu suchen. Das heißt, ^where|why$
ist langsamer als ^wh(ere|y)$
. Offensichtlich ist es in einem so kurzen Beispiel kein bemerkenswerter Unterschied, aber es ist wesentlich schneller, wenn es Tausende von Alternativen gibt und die Betreffzeile lang ist.Wie werden gemeinsame Präfixe für die Regex-Wortstammbildung erstellt?
Ich bin auf der Suche nach einem Weg, also diese automatisch ergeben zu tun, zum Beispiel ein string[] { "what", "why", "where", "when", "which" }
in wh(at|y|e(re|n)|i(ch))
zu konvertieren Gibt es bereits ein anerkannter Algorithmus gibt, die dies tut? Wenn nicht, wie würdest du das machen? Es scheint rekursiv zu sein, aber ich kann nicht ganz klar werden, wie es geht. Ich habe eine Methode, die ich schrieb, die in einem begrenzten Ausmaß funktioniert, aber es ist unelegant, 60 Zeilen lang und verwendet mehrere verschachtelte foreach-Schleifen, so dass es ein zukünftiger Wartungsalbtraum ist. Ich bin sicher, es ist ein viel besserer Weg, wenn jemand mich in die richtige Richtung zeigen könnte, die sehr geschätzt werden würde ...
IIRC gibt es ein * Perl * -Paket dafür. Und dann müssen Sie nur das in C# übersetzen ... – kennytm
Ich bin mir nicht sicher, ob es eine Bibliothek gibt, die das tut, aber eine Möglichkeit wäre, die Wörter in einen Trie zu laden und es dann zu laufen, um das zu produzieren Regex. http://en.wikipedia.org/wiki/Trie – Ani