如何为正则表达式引擎生成最重的内容?

时间:2017-05-03 21:36:02

标签: regex algorithm optimization pcre

我想知道自动生成小但非常重的内容以匹配某个正则表达式的方法。我的意思是,对于某种表达,我寻找最小和最重的有效载荷。 正式说heavy值是 H = regexp engine work time / content length 鉴于存在最大内容长度

regexp ([\w%]+=[\w%]*&){500}的示例: 检查内容匹配需要大约2500个步骤

A=& ... (498 times) ... A=&

并且检查内容不匹配需要大约250倍的步骤

A=& ... (498 times) ... A=

我的观察是:

  • 以wildchar序列开头的Regexp(例如)/^\w+.../是regexp引擎最差的
  • 通常引擎在尝试匹配正则表达式直到内容结束时执行更多计算,即内容不应与regexp匹配

构建此类有效载荷的线索是什么?

是否可以自动生成此类有效负载?

1 个答案:

答案 0 :(得分:1)

and it takes ~250 times more steps to check that content doesn't match

然而,这些步骤并未真实地表明性能。

不确定有效负载的含义。但测试
总是一个好主意 你的正则表达式在失败模式下(即让它失败)。

问题是你的正则表达式包含一个固定范围,最小(500)量词。

这启动了回溯机制,即使你的表达没有 包含嵌套量词。

由于您标记了PCRE,因此最好使用其中一个回溯控制动词
{500}量化的表达式中的某个位置 这将解除 组的回溯机制 在(*SKIP)匹配的字符串中, 引擎被禁止回去。

你可以获得这个应用程序RegexFormat的窗口
运行一些测试/基准测试场景。我有一个内置的基准测试工具。

匹配时间:

Regex1:   ([\w%]+=(?:[\w%]*&|(*SKIP)(*FAIL))){500}
Completed iterations:   1  /  1     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    0.26 s,   256.59 ms,   256588 µs

失败的时间:

Regex1:   ([\w%]+=(?:[\w%]*&|(*SKIP)(*FAIL))){500}
Completed iterations:   1  /  1     ( x 1000 )
Matches found per iteration:   0
Elapsed Time:    0.27 s,   270.76 ms,   270765 µs