Frage

Quelle

RegexOptions.IgnoreCase ist teurer als ich gedacht hätte (sollte z. B. kaum messbar sein)

Angenommen, dies gilt sowohl für PHP, Python, Perl, Ruby usw. als auch für C# (wovon ich annehme, dass Jeff es verwendet hat). Wie groß ist die Verlangsamung, und ob ich damit eine ähnliche Strafe erleiden muss? /[a-zA-z]/ wie ich will /[a-z]/i ?

War es hilfreich?

Lösung

Ja, [A-Za-z] geht viel schneller als das Einstellen RegexOptions.IgnoreCase, hauptsächlich wegen Unicode-Strings.Aber es ist auch viel einschränkender – [A-Za-z] schon nicht Wenn Sie internationale Zeichen mit Akzent anpassen, handelt es sich im wahrsten Sinne des Wortes um den A-Za-z-ASCII-Satz und nichts weiter.

Ich weiß nicht, ob Sie Tim Brays Antwort auf meine Nachricht gesehen haben, aber sie ist gut:

Eines der schwierigsten Probleme bei der internationalisierten Suche ist die Groß- und Kleinschreibung.Diese Groß-/Kleinschreibung ist auf Sprachen beschränkt, die in den Zeichensätzen Latein, Griechisch und Kyrillisch geschrieben sind.Englischsprachige Menschen erwarten natürlich, dass bei der Suche die Groß-/Kleinschreibung nicht beachtet wird, schon allein deshalb, weil sie faul sind:Wenn Nadia Jones bei Google nach sich selbst suchen möchte, wird sie wahrscheinlich einfach „Nadia Jones“ eingeben und erwarten, dass das System sich darum kümmert.

Daher ist es bei Suchsystemen durchaus üblich, Wörter zu „normalisieren“, indem sie sie alle in Klein- oder Großbuchstaben umwandeln, sowohl für die Indizierung als auch für Abfragen.

Das Problem besteht darin, dass die Zuordnung zwischen Fällen nicht immer so einfach ist wie im Englischen.Beispielsweise wird das deutsche Kleinbuchstabe „ß“ zu „SS“, wenn es in Großbuchstaben geschrieben wird, und das gute alte Großbuchstabe „I“, wenn es im Türkischen in Kleinbuchstaben geschrieben wird, wird zum punktlosen „ı“ (ja, sie haben „i“, das ist es). Die Großbuchstabenversion ist „İ“).Ich habe gelesen (aber nicht aus erster Hand überprüft), dass die Regeln für die Großschreibung von Zeichen mit Akzent wie „é“ in Frankreich und Québec unterschiedlich sind.Eines der Ergebnisse all dessen ist, dass Software wie java.String.toLowerCase() dazu neigt, erstaunlich langsam zu laufen, wenn sie versucht, all diese Eckfälle zu umgehen.

http://www.tbray.org/ongoing/When/200x/2003/10/11/SearchI18n

Andere Tipps

Wenn Sie Zahlen und Unterstriche in dieser Regex tolerieren können, können Sie z. B.Verwenden Sie den Modifikator \w (Perl-Syntax).Ich glaube, dass einige Engines [:alpha:] unterstützen, aber das ist kein reines Perl.\w berücksichtigt das Gebietsschema, in dem Sie sich befinden, und passt sowohl Groß- als auch Kleinbuchstaben an, und ich wette, es ist schneller als die Verwendung von [A-Z] unter Ignorieren der Groß- und Kleinschreibung.

Wenn Sie diesbezüglich Bedenken haben, kann es sich lohnen, das Gehäuse vor der Überprüfung auf „Alles oben“ oder „Alles unten“ einzustellen.
Zum Beispiel in Perl:

$x = "abbCCDGBAdgfabv";
(lc $x) =~ /bad/;

Kann in manchen Fällen besser sein als

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top