这是我正在研究的一个非常大的正则表达式的片段 - 由于缺乏更好的描述它基本上是一个从起始字符分支的树,我发现它可以提高性能(从根本上说:百万通过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
答案 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个字符。