Является ли нечувствительность к регистру регулярных выражений более медленной?

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

  •  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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top