RegexOptions.IgnoreCase比我想象的要贵(例如,应该几乎不可测量)
假设这适用于PHP,Python,Perl,Ruby等以及C#(这是我假设Jeff正在使用的),它的减速程度是多少,我会因{{1}而受到类似的惩罚我和/[a-zA-z]/
会一样吗?
答案 0 :(得分:17)
是的,[A-Za-z]比设置RegexOptions.IgnoreCase
要快得多,主要是因为Unicode字符串。但它也有更多的限制 - [A-Za-z] 不匹配重音的国际字符,它实际上是A-Za-z ASCII集,仅此而已。
我不知道你是否看到Tim Bray对我的信息的回答,但这是一个很好的答案:
国际化搜索中最棘手的问题之一是大写和小写。这种情况的概念仅限于用拉丁语,希腊语和西里尔字符集编写的语言。讲英语的人自然希望搜索不区分大小写只是因为他们很懒惰:如果Nadia Jones想要在Google上看,她可能只会输入nadia jones并期望系统能够处理它。
因此,搜索系统通过将所有单词转换为大写或小写来“标准化”单词,这对于索引和查询都是相当普遍的。
问题在于案例之间的映射并不总是像英语一样简单。例如,德国小写字母“ß”在上层时变为“SS”,而在土耳其语中下降的好旧资本“I”变成无点“ı”(是的,他们有“我”,其大写版本是“İ”)。我已经阅读(但未经过第一手验证),在法国和魁北克省,重新加上重音字符“é”的规则是不同的。所有这一切的结果之一是,像java.String.toLowerCase()这样的软件在尝试解决所有这些角落情况时往往会运行得非常慢。
http://www.tbray.org/ongoing/When/200x/2003/10/11/SearchI18n
答案 1 :(得分:1)
如果您可以容忍该正则表达式中的数字和下划线,您可以例如使用\ w修饰符(Perl语法)。我相信有些引擎支持[:alpha:],但这不是纯粹的Perl。 \ w考虑到你所在的语言环境,并且匹配大写和小写,我敢打赌它比使用[A-Z]更快而忽略大小写。
答案 2 :(得分:0)
如果您对此感到担心,可能需要在检查之前将案例设置为全部或全部更低。
例如,在Perl中:
$x = "abbCCDGBAdgfabv";
(lc $x) =~ /bad/;
在某些情况下可能优于
$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;