¿La insensibilidad entre mayúsculas y minúsculas de expresiones regulares es más lenta?

StackOverflow https://stackoverflow.com/questions/32010

  •  09-06-2019
  •  | 
  •  

Pregunta

Fuente

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

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

¿Fue útil?

Solución

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 caracteres internacionales acentuados, es literalmente el conjunto ASCII A-Za-z y nada más.

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

Una de las cuestiones más complicadas en la búsqueda internacionalizada son las mayúsculas y las minúsculas.Esta noción de caso se limita a los idiomas escritos en conjuntos de caracteres latinos, griegos y cirílicos.Los angloparlantes naturalmente esperan que la búsqueda no distinga entre mayúsculas y minúsculas, aunque sólo sea porque son vagos:Si Nadia Jones quiere buscarse en Google, probablemente simplemente escribirá nadia jones y esperará 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 todas a minúsculas o mayúsculas, tanto para la indexación como para las consultas.

El problema es que la correspondencia entre casos no siempre es tan sencilla como en inglés.Por ejemplo, el carácter alemán en minúscula “ß” se convierte en “SS” cuando está en mayúscula, y la vieja “I” mayúscula cuando está en minúscula en turco se convierte en “ı” sin puntos (sí, tienen “i”, su la versión en mayúsculas es “İ”).He leído (pero no lo he verificado de primera mano) que las reglas para poner en mayúsculas caracteres acentuados como “é” son diferentes en Francia y Quebec.Uno de los resultados de todo esto es que software como java.String.toLowerCase() tiende a funcionar sorprendentemente lento mientras intenta solucionar todos estos casos extremos.

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

Otros consejos

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

Si esto le preocupa, puede que valga la pena configurar el caso en mayúsculas o minúsculas antes de verificar.
Por ejemplo, en Perl:

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

En algunos casos puede ser mejor que

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top