2008-08-28 4 views
13

SourceL'insensibilité à la casse de regex est-elle plus lente?

RegexOptions.IgnoreCase est plus cher que je ne l'aurais pensé (par exemple, devrait être à peine mesurable)

En supposant que cela s'applique à PHP, Python, Perl, Ruby, etc, ainsi que C# (qui est ce que je suppose que Jeff utilisait), combien de ralentissement est-il et vais-je encourir une pénalité similaire avec /[a-zA-z]/ comme je le ferai avec /[a-z]/i?

+0

Warshaw @ Brian: '[A-z]' comprend quelques autres choses:

>>> ''.join([ chr(c) for c in range(ord('A'), ord('z')+1)]) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz'

Répondre

13

Oui, [A-Za-z] sera beaucoup plus rapide que le réglage de RegexOptions.IgnoreCase, principalement à cause des chaînes Unicode. Mais il est aussi beaucoup plus limitatif - [A-Za-z] ne pas correspondre caractères internationaux accentués, c'est littéralement le jeu ASCII A-Za-z et rien de plus.

Je ne sais pas si vous avez vu la réponse de Tim Bray à mon message, mais il est un bon:

L'une des questions les plus délicates à la recherche internationalisé est majuscules et minuscules. Cette notion de cas est limitée aux langues écrites dans les caractères latins, grecs et cyrilliques. Les anglophones s'attendent naturellement à ce que la recherche soit insensible à la casse, ne serait-ce que parce qu'ils sont paresseux: si Nadia Jones veut se retrouver sur Google, elle tapera probablement nadia jones et s'attendra à ce que le système s'en occupe.

Il est donc assez courant que les systèmes de recherche «normalisent» les mots en les convertissant tous en majuscules ou en minuscules, à la fois pour l'indexation et les requêtes.

Le problème est que la correspondance entre les cas n'est pas toujours aussi simple qu'en anglais. Par exemple, le caractère allemand "ß" minuscule devient "SS" en majuscule, et le bon vieux capital "I" en turc devient le "ı" sans point (oui, ils ont "i", son la version majuscule est "İ"). J'ai lu (mais pas vérifié de première main) que les règles pour mettre en valeur des caractères accentués tels que "é" sont différentes en France et au Québec. L'un des résultats de tout cela est que les logiciels tels que java.String.toLowerCase() ont tendance à fonctionner de manière étonnamment lente en essayant de contourner tous ces problèmes.

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

1

Si vous pouvez tolérer que des chiffres et souligne dans ce regex, vous pouvez par exemple utilisez le modificateur \ w (syntaxe Perl). Je crois que certains moteurs supportent [: alpha:], mais ce n'est pas du Perl pur. \ w prend en compte les paramètres régionaux dans lesquels vous vous trouvez, et correspond à la fois en majuscules et minuscules, et je parie que c'est plus rapide que d'utiliser [A-Z] en ignorant la casse.

0

Si cela vous inquiète, il peut être utile de régler le boîtier à tous les supérieurs ou inférieurs avant de vérifier.
Par exemple, en Perl:

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

mai dans certains cas mieux que

$x = "abbCCDGBAdgfabv"; 
$x =~ /bad/i; 
Questions connexes