正则表达式不区分大小写是否会变慢?

15

来源

RegexOptions.IgnoreCase比我想象的更耗费性能(例如,应该几乎不可测量)

假设这也适用于PHP、Python、Perl、Ruby等语言以及C#(我假设Jeff在使用这个),那么它会导致多少减速,并且使用/[a-zA-z]/和使用/[a-z]/i一样吗?


@Brian Warshaw:[A-z] 包括一些其他内容:<pre>>>> ''.join([ chr(c) for c in range(ord('A'), ord('z')+1)]) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz'</pre> - Anders Eurenius
3个回答

22

是的,[A-Za-z]比设置RegexOptions.IgnoreCase要快得多,这主要是由于Unicode字符串。但它也更加有限 - [A-Za-z]不匹配带重音的国际字符,它只是字母表中的A-Za-z ASCII集。

我不知道您是否看到了Tim Bray对我的消息的回答,但那是一个好答案:

国际化搜索中最棘手的问题之一是大小写。大小写的概念仅适用于使用拉丁、希腊和西里尔字符集编写的语言。以英语为母语的人自然希望搜索是不区分大小写的,因为他们很懒:如果Nadia Jones想在Google上查找自己,她可能只会输入nadia jones,并期望系统处理它。

因此,对于索引和查询,将单词全部转换为小写或大写是非常常见的。

问题在于,大小写之间的映射并不总是像在英语中那样直接。例如,德语小写字母“ß”在大写时变成“SS”,土耳其语中的大写字母“I”在小写时变成无点的“ı”(是的,他们有“I”,它的大写版本是“İ”)。我已经读过(但没有亲自验证),在法国和魁北克,重音字符“é”的大写规则是不同的。所有这些结果之一是,诸如java.String.toLowerCase()这样的软件往往非常慢,因为它试图避免所有这些边缘情况。

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


1

如果您可以容忍在正则表达式中使用数字和下划线,您可以使用 \w 修饰符(Perl 语法)。我相信一些引擎支持 [:alpha:],但那不是纯 Perl。\w 考虑到您所在的区域设置,并匹配大写和小写字母,而且我敢打赌它比使用 [A-Z] 忽略大小写更快。


0
如果您对此担心,可能值得在检查之前将大小写设置为全部大写或全部小写。
例如,在Perl中:
$x = "abbCCDGBAdgfabv";
(lc $x) =~ /bad/;

在某些情况下可能比较好

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接