Domanda

Fonte

RegexOptions.IgnoreCase è più costoso di quanto avrei pensato (ad esempio, dovrebbe essere a malapena misurabile)

Supponendo che questo vale per PHP, Python, Perl, Ruby, ecc così come il C# (che è quello che presumo Jeff stava usando), quanto di un rallentamento è e sarà applicata una penalità simile con /[a-zA-z]/ come farà /[a-z]/i ?

È stato utile?

Soluzione

Sì, [A-Za-z] sarà molto più veloce rispetto all'impostazione dell' RegexOptions.IgnoreCase, a causa , soprattutto, di stringhe Unicode.Ma è anche molto di più limitando -- [A-Za-z] non non partita accentuato i caratteri internazionali, è letteralmente A-Za-z set di caratteri ASCII e niente di più.

Non so se avete visto Tim Bray risposta al mio messaggio, ma è un buon compromesso.

Uno dei più spinosi problemi in internazionalizzato ricerca maiuscole e minuscole.Questa nozione di caso limitato di lingue scritta in latino, greco e Cirillico set di caratteri.Madrelingua inglese, naturalmente, si aspettano di ricerca per essere maiuscole e minuscole se solo perché sono pigri:se Nadia Jones vuole guardare se stessa Google ha probabilmente solo tipo di nadia jones e aspettiamo che il sistema per prendersi cura di esso.

Quindi è abbastanza comune per i sistemi di ricerca per “normalizzare” parole di convertirli tutti inferiori o superiori, sia per l'indicizzazione e la query.

Il guaio è che il mapping tra i casi non è sempre semplice in quanto è in inglese.Per esempio, il tedesco minuscolo carattere “ß” diventa “SS” quando superiore-rivestiti, e il buon vecchio capitale “io” quando insaccata in turco diventa il punto “ı” (sì, sono “io”, il suo superiore-caso la versione “I”).Ho letto (ma non verificato prima mano) che le regole per upcasing caratteri accentati, ad “é” sono diversi in Francia e Québec.Uno dei risultati di tutto questo è che un software come java.Stringa.toLowerCase() tende a funzionare sorprendentemente lento come si cerca di ovviare a tutte queste angolo casi.

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

Altri suggerimenti

Se si può tollerare di avere i numeri e caratteri di sottolineatura in che regex, si può ad esempioutilizzare il \modificatore w (Perl sintassi).Credo che alcuni motori di supporto [:alpha:], ma che non è puro Perl.\w prende in considerazione il locale che si trova, e corrisponde sia lettere maiuscole e minuscole, e scommetto che è più veloce rispetto all'utilizzo di [A-Z] ignorando caso.

Se siete preoccupati per questo, può essere utile impostare il caso a tutti i superiori o inferiori, prima di controllare.
Per esempio, in Perl:

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

In alcuni casi, può essere meglio di

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top