这是一个正则表达式,用于从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\.-]+)