Является ли нечувствительность к регистру регулярных выражений более медленной?
-
09-06-2019 - |
Вопрос
RegexOptions.IgnoreCase стоит дороже, чем я бы думал (например, должен быть едва измеримым)
Предполагая, что это применимо к PHP, Python, Perl, Ruby и т.д., А также к C # (что, как я предполагаю, использовал Джефф), насколько сильно это замедлит работу и понесу ли я аналогичный штраф с /[a-zA-z]/
как я сделаю с /[a-z]/i
?
Решение
Да, [A-Za-z] будет намного быстрее, чем установка RegexOptions.IgnoreCase
, в основном из-за строк в Юникоде.Но это также гораздо более ограничивает - [A-Za-z] делает нет сопоставьте международные символы с ударением, это буквально набор ASCII A-Za-z и ничего более.
Я не знаю, видели ли вы ответ Тима Брэя на мое сообщение, но он хороший:
Одна из самых сложных проблем в интернационализированном поиске - это прописные и строчные буквы.Это понятие регистра ограничено языками, написанными латинскими, греческими и кириллическими наборами символов.Носители английского языка, естественно, ожидают, что поиск будет нечувствительным к регистру, хотя бы потому, что они ленивы:если Надя Джонс захочет поискать себя в Google, она, вероятно, просто введет nadia jones и будет ожидать, что система позаботится об этом.
Таким образом, поисковые системы довольно часто “нормализуют” слова, переводя их все в нижний или заглавный регистр, как для индексации, так и для запросов.
Проблема в том, что сопоставление между падежами не всегда такое простое, как в английском.Например, немецкая строчная буква “β” становится “SS" при написании в верхнем регистре, а старая добрая заглавная буква “I” при написании в нижнем регистре в турецком языке становится буквой “без точек" (да, у них есть “i”, ее заглавная версия - “I”).Я читал (но не проверял из первых рук), что правила выделения символов с ударением, таких как “é”, отличаются во Франции и Квебеке.Одним из результатов всего этого является то, что такие программы, как java.String.Функция toLowerCase(), как правило, работает поразительно медленно, поскольку пытается обойти все эти закоулки.
http://www.tbray.org/ongoing/When/200x/2003/10/11/SearchI18n
Другие советы
Если вы можете мириться с наличием цифр и подчеркиваний в этом регулярном выражении, вы можете, напримериспользуйте модификатор \w (синтаксис Perl).Я полагаю, что некоторые движки поддерживают [: alpha:], но это не чистый Perl.\w учитывает языковой стандарт, в котором вы находитесь, и соответствует как заглавным, так и строчным буквам, и я уверен, что это быстрее, чем использовать [A-Z], игнорируя регистр.
Если вас это беспокоит, возможно, имеет смысл перед проверкой установить для регистра значение "все верхние" или "все нижние".
Например, в Perl:
$x = "abbCCDGBAdgfabv";
(lc $x) =~ /bad/;
Может в некоторых случаях быть лучше, чем
$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;