Нечувствительность к регистровому регистру медленнее?

Источник

RegexOptions.IgnoreCase дороже, чем я думал (например, должен быть едва измерим)

Предполагая, что это относится к PHP, Python, Perl, Ruby и т.д., а также к С# (что, как я полагаю, использовал Джефф), насколько замедляется это, и я буду подвергать аналогичному штрафу с помощью /[a-zA-z]/ как Я буду с /[a-z]/i?

Ответы

Ответ 1

Да, [A-Za-z] будет намного быстрее, чем установка RegexOptions.IgnoreCase, в основном из-за строк Unicode. Но это также намного более ограничивает - [A-Za-z] не соответствует акцентированным международным символам, это буквально набор A-Za-z ASCII и ничего более.

Я не знаю, видел ли Тим Брей ответ на мое сообщение, но он хороший:

Один из самых сложных вопросов в интернационализированном поиске - это верхний и нижний регистр. Это понятие случая ограничено языками, написанными на латинском, греческом и кириллическом наборах символов. Конечно, англоязычные пользователи ожидают, что поиск будет нечувствительным к регистру, хотя бы потому, что они ленивы: если Надя Джонс хочет выглядеть на оболочке Google, вероятно, просто введите nadia jones и ожидайте, что система позаботится об этом.

Таким образом, довольно часто для поисковых систем "нормализовать" слова, преобразовывая их все в нижний или верхний регистр, как для индексирования, так и для запросов.

Проблема в том, что сопоставление между случаями не всегда так же просто, как и на английском. Например, немецкий нижний регистр "ß" становится "SS", когда верхний, а старый добрый капитал "I", когда опущенный на турецком языке становится бесчисленным "ı" (да, у них есть "i", его версия верхнего регистра - "İ" ). Я прочитал (но не подтвердил из первых рук), что правила для воссоздания акцентированных символов, таких как "é", различны во Франции и Квебеке. Одним из результатов всего этого является то, что программное обеспечение, такое как java.String.toLowerCase(), имеет тенденцию работать удивительно медленно, поскольку оно пытается обойти все эти угловые регистры.

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

Ответ 2

Если вы можете терпеть наличие чисел и подчеркиваний в этом регулярном выражении, вы можете, например, используйте модификатор \w (синтаксис Perl). Я считаю, что некоторые двигатели поддерживают [: alpha:], но это не чистый Perl.\w учитывает локаль, в которой вы находитесь, и соответствует как верхним, так и нижним регистрам, и я уверен, что это быстрее, чем использование [A-Z] при игнорировании дела.

Ответ 3

Если вы беспокоитесь об этом, возможно, стоит поставить корпус на все верхние или все нижние, прежде чем вы проверите.
Например, в Perl:

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

В некоторых случаях может быть лучше, чем

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;