什么是最有效的不区分大小写的grep用法?

42

我的目标是匹配属于Yahoo!域名家族的电子邮件地址。在*nix系统中(我将使用Ubuntu),对于这些匹配模式的任何一种方法,有哪些优点和缺点?

如果还有另一种更优雅的解决方案,我没有想象到,请分享。

它们在这里:

  • 使用带有选项-igrep

grep -Ei "@(yahoo|(y|rocket)mail|geocities)\.com"

  • 将字符转换为全大写或小写,然后使用grep

tr [:upper:] [:lower:] < /path/to/file.txt | grep -E "@(yahoo|(y|rocket)mail|geocities)\.com"

  • 为每个模式中的每个字符包含一个字符集(当然,下面的示例不会匹配像"@rOcketmail.com"这样的内容,但你可以得到如果我检查每个字符的情况下会变成什么):

grep -E "@([yY]ahoo|([yY]|[rR]ocket)[mM]ail|[gG]eo[cC]ities)\.[cC][oO][mM]" /path/to/file.txt


5
这个测试不难进行。你试过了吗? - user1864610
1
你尝试过基准测试吗?我怀疑你的第一个样本会更快。我认为这个问题更可能受到文件I/O的限制,而不是处理速度...因为它与输入大小成线性关系。要注意微观优化 - Floris
你可能需要记住的一件事是捕获组可能很耗费资源。如果你不需要返回分组的值,可以考虑使用 (?:) - CAustin
1个回答

46

grep -i 的速度明显比在 grepping 之前将内容转换为小写要慢得多,因此我最终使用了第二种方法的变体。

感谢 @mike-w 提醒我进行简单测试,效果非常好。


6
感谢您与我们分享测试结果! - Dan Bechard
你能定义一下“显著”吗?如果一个方法需要10秒钟,而另一个需要30秒钟,那么在“显著”的情况下,我们可以根据服务器负载、目录遍历、创建正则表达式的时间等因素来自行判断使用哪种方法。 - wruckie
我暂时不会重新访问测试,但你提出了一个有效的观点,量化差异会很好。 - sblack89

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