正则表达式-最有效的表达式,用于在行首或特定字符后进行匹配

时间:2018-08-16 09:00:36

标签: regex performance

我正在尝试找到最有效的方式来匹配行首之后或另一个字符之后的字符。

匹配条件

ad([sxv])?[0-9]*[-_.]-需要在^之后或[-_.]

之后立即找到与之匹配的内容

注意:我不能100%确定处理器使用哪种正则表达式,但是它似乎不支持非捕获组。

场景:

用户尝试访问一个域,然后根据几个正则表达式对它进行检查(包括此示例)。如果找不到匹配项,则允许访问。

示例用户输入(将被阻止):

ad.dailymail.co.uk
asdsa.adasdsa.dasdasd.asdasdasd.dasdasdsa.ad.test.com

正则表达式测试:

ad.dailymail.co.uk

  • (^|[-_.])ad([sxv])?[0-9]*[-_.]-13个步骤
  • ^(.*[-_.])?ad([sxv])?[0-9]*[-_.]-36个步骤
  • ^([a-z0-9]([a-z0-9-]*[a-z0-9])?[-_.])*ad([sxv])?[0-9]*[-_.]-69步

asdsa.adasdsa.dasdasd.asdasdasd.dasdasdsa.ad.test.com

  • (^|[-_.])ad([sxv])?[0-9]*[-_.]-151步
  • ^(.*[-_.])?ad([sxv])?[0-9]*[-_.]-28个步骤
  • ^([a-z0-9]([a-z0-9-]*[a-z0-9])?[-_.])*ad([sxv])?[0-9]*[-_.]-86步

到目前为止,看来^(.*[-_.])?ad([sxv])?[0-9]*[-_.]效率最高,但是还有另一种方法可以检查速度是否更快?

还可以说我的理由(^|[-_.])比其他表达式消耗更多的步骤吗?

1 个答案:

答案 0 :(得分:1)

您可以修改第二个正则表达式以对第一组使用??修饰符。因此,如果您一开始就已经发现“ ad ...”,它就会变得很懒惰,并会在0处停止。

Demo

它的步数比第一个正则表达式要少(这是最快的)(9步对10步)

不利之处在于,对于任何“非以广告开头”的网址,可能会变得更糟(额外增加0-2个步骤)。它还将取决于是否匹配。如果不匹配,则两个正则表达式具有相同的步骤。如果它们匹配,则可能需要再增加1-2个步骤。

您可以进行数学运算并计算此类网址的数量,然后根据概率决定

最后,我用所有结果制成了一张桌子:

enter image description here