Javascript 捕获组的效率(?:=>;工作(?:\s+;)?组与工作(\s+;)?组

Javascript 捕获组的效率(?:=>;工作(?:\s+;)?组与工作(\s+;)?组,javascript,regex,regex-group,capturing-group,Javascript,Regex,Regex Group,Capturing Group,这两种表达方式都适用于我: E1=> work(?:\s+)?group E2=> work(\s+)?group 考虑到空间可能是换行符(\s+),我需要捕获工作组或工作组 但是,第一个表达式有一个非捕获组(?:),我想知道正则表达式的性能/快速输出是更差还是更好。换句话说,就性能而言,什么是最好的表达式?答案实际上取决于您使用的正则表达式引擎的内部结构 在Javascript中,我不知道哪个更快 在PHP中,捕获组可以更快一些 <?php $string = "WOR

这两种表达方式都适用于我:

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

E2=> work(\s+)?group
考虑到空间可能是换行符(\s+),我需要捕获
工作组
工作组


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

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

在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 />";

?>

为什么不使用
\s*
?当问题是a会比b快还是b比a快时,最好的解决方案就是为自己设置一个小基准。非捕获组可能是最小的内存占用量,但
\s*
是更好的解决方案,正如前面所建议的。非捕获组正则表达式分析器/词法分析器将花费更长的时间,但由于不必存储捕获,执行速度会更快。@MichaelBerkowski:“最小的一点,大大减少了内存占用”:在当前示例中,可能是这样,但一般来说,这取决于CAPTURANKS成员的大小。从您身上学到了很多。我现在使用\s*。考虑到一个真正的表达式,我需要从两个表达式中选择一个(?:区别,基于正则表达式效率/性能,您会选择什么。我的数据库有6700个索引PDF,2108964个单词。Exp1=>WORD1(?:\s+\w+{0,2}\s*\bdefin(es?| ed |条件?| ing)\b/Exp2=>WORD1(\s+\w+{0,2}\s*\bdefin(es?| ed |条件?|ing)B谢谢!嘿,你还在跟你的问题摔跤吗?还是解决了?BTW,我注意到你还没有投票给StActPoad。如果这个答案或另一个答案解决了你的问题,请考虑“接受它”。单击左侧的复选标记和箭头,因为这是声誉系统的工作方式。当然,没有义务这样做。稍后当您的声誉更高时,您也可以向上投票问题。感谢收听我的20秒so教程。:)
Non-Capture Group: 1.092001914978
Capture Group: 1.0608019828796
difference: -2.857131628658 percent longer