Является ли регистронезависимость медленнее? - PullRequest
14 голосов
/ 28 августа 2008

Источник

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

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

Ответы [ 3 ]

17 голосов
/ 28 августа 2008

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

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

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

Так что в поисковых системах довольно часто «нормализуют» слова, переводя их в нижний или верхний регистр, как для индексации, так и для запросов.

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

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

1 голос
/ 28 августа 2008

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

0 голосов
/ 28 августа 2008

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

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

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

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...