试图找到针对二进制匹配的大模式的正则表达式性能调整

时间:2015-08-04 15:02:50

标签: regex preg-match

这是我正在研究的一个非常大的正则表达式的片段 - 由于缺乏更好的描述它基本上是一个从起始字符分支的树,我发现它可以提高性能(从根本上说:百万通过3.6s减少到0.875或多个)。

出于某种原因,使用?:跳过反向引用并没有加速任何事情,但我发现?>在没有错误的情况下切掉了200万次传递。

但是我在性能调整方面处于死胡同 - 我仍然看到那里的模式,但我对高级正则表达不太了解以进一步重新排序。

是否有任何明显的调整我错过了?

如果我前瞻并检查[\xa6-\xbf]是否是\xF0\x9F\x87所遵循的下一个字符或以某种方式中止子模式搜索,它会有帮助吗? (基本测试显示添加\x87(?>(?=[\xa6-\xbf]\xF0\x9F\x87)不会改变任何内容)

或许我应先找\xF0\x9F\x87,然后再看[\xa6-\xbf]

      /\x87(?>                   
              \xa6\xF0\x9F\x87[\xa8-\xac\xae\xb1\xb2\xb4\xb7\xb9\xba\xbc\xbf]
            | \xa7\xF0\x9F\x87[\xa6\xa7\xa9-\xaf\xb2-\xb4\xb7-\xb9\xbc\xbe\xbf]
            | \xa8\xF0\x9F\x87[\xa6\xa9\xab-\xae\xb1-\xb4\xb7\xba\xbb\xbe\xbf]
            | \xa9\xF0\x9F\x87[\xaa\xaf\xb0\xb2\xb4\xbf]
            | \xaa\xF0\x9F\x87[\xa8\xaa\xac\xad\xb7-\xb9]
            | \xab\xF0\x9F\x87[\xae-\xb0\xb2\xb4\xb7]
            | \xac\xF0\x9F\x87[\xa6\xa7\xa9\xaa\xad\xae\xb1-\xb3\xb6\xb7\xb9\xba\xbc\xbe]
            | \xad\xF0\x9F\x87[\xb0\xb3\xb7\xb9\xba]
            | \xae\xF0\x9F\x87[\xa9\xaa\xb1\xb3\xb6-\xb9]
            | \xaf\xF0\x9F\x87[\xaa\xb2\xb4\xb5]
            | \xb0\xF0\x9F\x87[\xaa\xac-\xae\xb2\xb3\xb5\xb7\xbc\xbe\xbf]
            | \xb1\xF0\x9F\x87[\xa6-\xa8\xae\xb0\xb7\xb8\xb9\xba\xbb\xbe]
            | \xb2\xF0\x9F\x87[\xa6\xa8-\xaa\xac\xad\xb0-\xb4\xb7\xb8\xb9\xba-\xbf]
            | \xb3\xF0\x9F\x87[\xa6\xa8\xaa\xac\xae\xb1\xb4\xb5\xb7\xba\xbf]
            | \xb4\xF0\x9F\x87[\xb2]
            | \xb5\xF0\x9F\x87[\xa6\xaa-\xad\xb0\xb1\xb7-\xb9\xbc\xbe]
            | \xb6\xF0\x9F\x87[\xa6]
            | \xb7\xF0\x9F\x87[\xb4\xb8\xba\xbc]
            | \xb8\xF0\x9F\x87[\xa6-\xaa\xac-\xae\xb0-\xb4\xb7\xb9\xbb\xbe\xbf]
            | \xb9\xF0\x9F\x87[\xa9\xac\xad\xaf\xb1-\xb4\xb7\xb9\xbb\xbc\xbf]
            | \xba\xF0\x9F\x87[\xa6\xac\xb8\xbe\xbf]
            | \xbb\xF0\x9F\x87[\xa6\xa8\xaa\xae\xb3\xba]
            | \xbc\xF0\x9F\x87[\xab\xb8]
            | \xbd\xF0\x9F\x87[\xb0]
            | \xbe\xF0\x9F\x87[\xaa]
            | \xbf\xF0\x9F\x87[\xa6\xb2\xbc]
            | [\xa6-\xbf]   
      )/xS

1 个答案:

答案 0 :(得分:1)

经过深思熟虑和实验后,我发现了一个调整。

看看这个,又花了200ms。

| \x87(?>(?=.\xF0\x9F\x87)
      \xa6...[\xa8-\xac\xae\xb1\xb2\xb4\xb7\xb9\xba\xbc\xbf]
    | \xa7...[\xa6\xa7\xa9-\xaf\xb2-\xb4\xb7-\xb9\xbc\xbe\xbf]
    | \xa8...[\xa6\xa9\xab-\xae\xb1-\xb4\xb7\xba\xbb\xbe\xbf]
    | \xa9...[\xaa\xaf\xb0\xb2\xb4\xbf]
    etc.

基本上我会在第一个角色后对魔术3个字符进行预测,然后告诉它不要担心每个后续项目的3个字符。