【问题标题】:Efficiency in capturing groups (?: => work(?:\s+)?group VERSUS work(\s+)?group捕获组的效率 (?: => work(?:\s+)?group VERSUS work(\s+)?group
【发布时间】:2014-04-26 20:48:13
【问题描述】:

这两种表达方式都适合我:

E1=> work(?:\s+)?group 

E2=> work(\s+)?group

考虑到空格可能是换行符 (\s+),我需要捕获 workgroupwork group

但是,第一个表达式有一个非捕获组(?:,我想知道它在正则表达式的性能/快速输出方面是更差还是更好。换句话说,就性能而言,什么是最好的表达方式?

【问题讨论】:

  • 你为什么不用\s*
  • 只要问题是a 会比 b 快还是 b 会比 a 快,最好的解决方案就是为自己设置一个小基准。非捕获组可能是最小的一点内存密集型,但\s* 是一个更好的解决方案,正如已经建议的那样。
  • 一个非捕获组对于正则表达式解析器/词法分析器将花费更长的时间,但由于不必存储捕获而执行得更快。
  • @MichaelBerkowski:“最小的一点内存密集型不可估量”:在当前示例中可能,但通常它取决于捕获的大小
  • 谢谢大家。向你学习很多。我现在正在使用 \s* 。考虑到一个真实的表达式,我需要从两个中选择 (?: 差异,根据正则表达式的效率/性能,您会选择什么。我的数据库有 6700 个索引 PDF 和 2,108,964 个单词。Exp1=> WORD1(?:\s+\w+ ){0,2}\s*\bdefin(es?|ed|itions?|ing)\b / Exp2=> WORD1(\s+\w+){0,2}\s*\bdefin(es?|ed |itions?|ing)\b 谢谢!

标签: javascript regex regex-group capturing-group


【解决方案1】:

答案实际上取决于您使用的正则表达式引擎的内部结构。

在 Javascript 中,我不知道哪个更快。

在 PHP 中,捕获组可能会更快一些。这是一个简单的测试,带有您的正则表达式的简化版本。

<?php
$string = "WORD1".str_repeat(" someword",100000);
$regex1="~WORD1(?:\s+\w+){0,2}~";
$regex2="~WORD1(\s+\w+){0,2}~";

$start=microtime(TRUE);
for ($i=1;$i<1000000;$i++) preg_match($regex1,$string);
$noncapend=microtime(TRUE);
for ($i=1;$i<1000000;$i++) preg_match($regex2,$string);
$withcapend=microtime(TRUE);
$noncap = $noncapend-$start;
$withcap = $withcapend-$noncapend;
$diff = 100*($withcap-$noncap)/$noncap;
echo "Non-Capture Group: ".$noncap."<br />";
echo "Capture Group: ".$withcap."<br />";
echo "difference: ".$diff." percent longer<br />";

?>

输出:

请注意,您每次都会得到不同的结果。

Non-Capture Group: 1.092001914978
Capture Group: 1.0608019828796
difference: -2.857131628658 percent longer

【讨论】:

  • 嘿,你还在纠结你的问题,还是解决了?顺便说一句,我注意到你还没有对 StackOverflow 投票。如果此答案或其他答案解决了您的问题,请考虑通过单击左侧的复选标记和箭头来“接受”,因为这就是信誉系统的工作方式。当然,没有义务这样做。稍后,当您获得更多声誉时,您也可以提出问题。感谢收听我的 20 秒 SO 教程。 :)
猜你喜欢
  • 2022-07-28
  • 2021-10-03
  • 2014-03-06
  • 2011-12-21
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多