首页 > 解决方案 > 加速正则表达式

问题描述

这是一个从 SQL 语句中提取表名的正则表达式:

(?:\sFROM\s|\sINTO\s|\sNEXTVAL[\s\W]*|^UPDATE\s|\sJOIN\s)[\s`'"]*([\w\.-_]+)

它匹配一个标记,可选地包含在 中[`'"],前面是 FROM 等,由空格包围,除了没有前导空格的 UPDATE 。

我们执行了许多正则表达式,这是最慢的,我不知道为什么。SQL 字符串的大小可以达到 4k,在 2.2GHz i7 MBP 上执行时间最多为 0.35ms。

这是一个慢速输入示例:https ://pastebin.com/DnamKDPf

我们能做得更好吗?将其拆分为多个正则表达式将是一种选择,如果交替是一个问题也是如此。

标签: javaregexperformance

解决方案


因为比赛通常接近尾声,一种可能性是基本上从尾端开始并回溯,而不是从开始和正轨开始,类似于

^(?:UPDATE\s|.*(?:\s(?:(?:FROM|INTO|JOIN)\s|NEXTVAL[\s\W]*)))[\s`'\"]*([\w\.-_]+)

https://regex101.com/r/SO7M87/1/(154步)

虽然当匹配存在时这可能会快得多,但在没有匹配时它只是一个适度的改进,因为模式必须一直回溯到开始(从~23k步开始~9000步)


推荐阅读