È regex caso insensibilità più lento?
-
09-06-2019 - |
Domanda
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
?
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;