15

来源

RegexOptions.IgnoreCase 比我想象的要贵(例如,应该几乎无法测量)

假设这适用于 PHP、Python、Perl、Ruby 等以及 C#(这是我假设 Jeff 正在使用的),它的速度会降低多少,我是否会/[a-zA-z]/像我一样受到类似的惩罚/[a-z]/i

4

3 回答 3

20

是的, [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

于 2008-08-28T11:23:59.427 回答
1

如果您可以容忍在该正则表达式中包含数字和下划线,您可以例如使用 \w 修饰符(Perl 语法)。我相信有些引擎支持 [:alpha:],但这不是纯粹的 Perl。\w 考虑到您所在的语言环境,并匹配大写和小写,我敢打赌它比使用 [AZ] 时忽略大小写要快。

于 2008-08-28T11:59:31.713 回答
0

如果您担心这一点,在检查之前将表壳设置为全高或全低可能是值得的。
例如,在 Perl 中:

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

在某些情况下可能比

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;
于 2008-08-28T12:51:35.177 回答