捕获组的效率(?:=> work(?:\ s +)?group VERSUS work(\ s +)?group

时间:2014-04-26 20:48:13

标签: javascript regex regex-group capturing-group

这两个表达对我有用:

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

E2=> work(\s+)?group

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

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

1 个答案:

答案 0 :(得分: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