2008-08-28 23 views
13

Source¿La insensibilidad de la caja regex es más lenta?

RegexOptions.IgnoreCase es más caro de lo que hubiera pensado (por ejemplo, debería ser apenas medible)

Suponiendo que esto se aplica a PHP, Python, Perl, Ruby, etc, así como C# (que es lo que supongo que estaba usando Jeff), ¿cuánto de una desaceleración es e incurriré en una pena similar con /[a-zA-z]/ como lo haré con /[a-z]/i?

+0

@ Brian Warshaw: '[A-z]' incluye algunas cosas más:

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

Respuesta

13

Sí, [A-Za-z] será mucho más rápido que configurar el RegexOptions.IgnoreCase, en gran parte debido a las cadenas Unicode. Pero también es mucho más limitante - [A-Za-z] no no coincide con coincide con los caracteres internacionales acentuados, es literalmente el conjunto A-Za-z ASCII y nada más.

No sé si has visto la respuesta de Tim Bray a mi mensaje, pero es una buena:

Una de las cuestiones más difíciles en la búsqueda internacionalizado es mayúscula y minúscula. Esta noción de caso está limitada a los idiomas escritos en los juegos de caracteres latinos, griegos y cirílicos. Los hablantes de inglés, naturalmente, esperan que la búsqueda no distinga entre mayúsculas y minúsculas solo porque son flojos: si Nadia Jones quiere buscarse a sí misma en Google, probablemente solo escriba nadia jones y espere que el sistema se encargue de ello.

Por lo tanto, es bastante común que los sistemas de búsqueda "normalicen" las palabras convirtiéndolas en mayúsculas o minúsculas, tanto para la indexación como para las consultas.

El problema es que el mapeo entre casos no siempre es tan sencillo como en inglés. Por ejemplo, el carácter minúsculo alemán "ß" se convierte en "SS" cuando está en mayúscula y el antiguo y "I" mayúscula cuando está en mayúscula en turco se convierte en el "I" sin punto (sí, tienen "i", es la versión en mayúscula es "İ"). He leído (pero no verificado de primera mano) que las reglas para interpretar caracteres acentuados como "é" son diferentes en Francia y Québec. Uno de los resultados de todo esto es que el software como java.String.toLowerCase() tiende a ejecutarse sorprendentemente lento, ya que trata de evitar todos estos casos de esquina.

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

1

Si se puede tolerar que los números y guiones en esa expresión regular, por ejemplo, se puede use el modificador \ w (sintaxis de Perl). Creo que algunos motores admiten [: alpha:], pero eso no es puro Perl. \ w tiene en cuenta la configuración regional en la que se encuentra, y coincide tanto en mayúscula como en minúscula, y apuesto a que es más rápido que usar [A-Z] mientras ignora la caja.

0

Si le preocupa esto, puede valer la pena establecer el caso en la parte superior o inferior antes de comprobar.
Por ejemplo, en Perl:

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

en algunos casos puede ser mejor que

$x = "abbCCDGBAdgfabv"; 
$x =~ /bad/i; 
Cuestiones relacionadas