来源

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

假设这适用于 PHP、Python、Perl、Ruby 等以及 C#(我假设 Jeff 使用的是 C#),那么速度会减慢多少,我是否会受到类似的惩罚 /[a-zA-z]/ 正如我将与 /[a-z]/i ?

有帮助吗?

解决方案

是的,[A-Za-z] 会比设置 RegexOptions.IgnoreCase, ,很大程度上是因为 Unicode 字符串。但它也有更多的限制——[A-Za-z]确实如此 不是 匹配带重音的国际字符,它实际上是 A-Za-z ASCII 集,仅此而已。

我不知道你是否看到蒂姆·布雷对我的消息的回答,但这是一个很好的回答:

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

因此,搜索系统通过将单词全部转换为小写或大写来“规范化”单词是相当常见的,无论是用于索引还是查询。

问题在于,案例之间的映射并不总是像英语中那样简单。例如,德语小写字符“ß”在大写时变成“SS”,而土耳其语中的旧大写字符“I”在小写时变成无点“ı”(是的,他们有“i”,它的大写版本是“ı”)。我读过(但未经第一手验证),在法国和魁北克,大写重音字符(例如“é”)的规则是不同的。所有这一切的结果之一是,像 java.String.toLowerCase() 这样的软件在尝试解决所有这些极端情况时往往运行速度慢得惊人。

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

其他提示

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

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

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

在某些情况下可能比

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top