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

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

它与 token (可选地包含在[`'"]中)匹配, token 之前由FROM等,并由空白包围,但UPDATE除外,后者没有前导空白。

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

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

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

最佳答案

有一个rule of thumb:

如果存在边界,请勿让引擎尝试匹配每个单个字符。

尝试以下正则表达式(在给定的输入字符串上约2500个步骤):

(?!FROM|INTO|NEXTVAL|UPDATE|JOIN)\S*\s*|\w+\W*(\w[\w\.-]*)

Live demo

注意:您需要的是第一个捕获组。

根据评论,最终的正则表达式(比以前的正则表达式慢一点):
(?!(?:FROM|INTO|NEXTVAL|UPDATE|JOIN)\b)\S*\s*|\b(?:NEXTVAL\W*|\w+\s[\s`'"]*)([\[\]\w\.-]+)

10-05 18:05