Pergunta

Fonte

RegexOptions.IgnoreCase é mais caro do que eu pensava (por exemplo, deveria ser pouco mensurável)

Supondo que isso se aplica a PHP, Python, Perl, Ruby etc., bem como a C# (que é o que presumo que Jeff estava usando), qual é o grau de lentidão e incorrerei em uma penalidade semelhante com /[a-zA-z]/ como eu farei com /[a-z]/i ?

Foi útil?

Solução

Sim, [A-Za-z] será muito mais rápido do que definir o RegexOptions.IgnoreCase, em grande parte por causa das strings Unicode.Mas também é muito mais limitante - [A-Za-z] faz não combinar caracteres internacionais acentuados, é literalmente o conjunto A-Za-z ASCII e nada mais.

Não sei se você viu a resposta de Tim Bray à minha mensagem, mas é boa:

Um dos problemas mais complicados na pesquisa internacionalizada são letras maiúsculas e minúsculas.Esta noção de caso é limitada a idiomas escritos nos conjuntos de caracteres latinos, gregos e cirílicos.Os falantes de inglês naturalmente esperam que a pesquisa não diferencie maiúsculas de minúsculas, apenas porque são preguiçosos:se Nadia Jones quiser se pesquisar no Google, ela provavelmente digitará nadia jones e esperará que o sistema cuide disso.

Portanto, é bastante comum que os sistemas de pesquisa “normalizem” as palavras, convertendo-as todas em letras minúsculas ou maiúsculas, tanto para indexação quanto para consultas.

O problema é que o mapeamento entre casos nem sempre é tão simples como em inglês.Por exemplo, o caractere minúsculo alemão “ß” torna-se “SS” quando maiúsculo, e o bom e velho “I” maiúsculo quando maiúsculo em turco torna-se o “ı” sem ponto (sim, eles têm “i”, seu versão em maiúscula é “İ”).Eu li (mas não verifiquei em primeira mão) que as regras para aumentar caracteres acentuados como “é” são diferentes na França e em Quebec.Um dos resultados de tudo isso é que softwares como java.String.toLowerCase() tendem a funcionar surpreendentemente lento enquanto tentam contornar todos esses casos extremos.

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

Outras dicas

Se você tolera números e sublinhados nesse regex, pode, por exemplo.use o modificador \w (sintaxe Perl).Acredito que alguns motores suportam [:alpha:], mas isso não é Perl puro.\w leva em consideração a localidade em que você está e corresponde a letras maiúsculas e minúsculas, e aposto que é mais rápido do que usar [A-Z] ignorando maiúsculas e minúsculas.

Se você estiver preocupado com isso, pode valer a pena definir o caso como totalmente superior ou inferior antes de verificar.
Por exemplo, em Perl:

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

Pode, em alguns casos, ser melhor do que

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top