正则表达式优化:如何获取INSERT INTO后的第一个目标表名
如何用正则提取INSERT INTO后的第一个表名?
嘿,我明白你的需求了!你原来的正则(?<=INSERT INTO\b).*之所以会匹配到DB.SCHEMA.TABLE VALUES(?,?,?),是因为.*是贪婪匹配,会把INSERT INTO之后直到字符串结尾的所有内容都捞进来。要只拿到紧跟的第一个词(也就是你的表名DB.SCHEMA.TABLE),只需要调整正则,让它匹配到第一个空白字符就停止就行。
这里有两种靠谱的方案:
方案1:用非空白字符匹配(推荐)
直接把.*换成\S+,正则变成:
(?<=INSERT INTO\b)\S+
\S+的意思是匹配一个或多个非空白字符,刚好会停在第一个空格(也就是VALUES前面的空格)那里,完美捕获你的表名。
方案2:用非贪婪匹配+正向先行断言
如果你更习惯用断言的写法,也可以改成非贪婪匹配,直到遇到第一个空格:
(?<=INSERT INTO\b).*?(?=\s)
.*?是非贪婪匹配,会尽可能少地匹配字符;(?=\s)是正向先行断言,确保接下来的字符是空白字符,这样就会在表名后面的空格处停止匹配。
测试验证
用你的原字符串测试:
var Sql=" INSERT INTO DB.SCHEMA.TABLE VALUES(?,?,?)";
两个正则都会精准匹配到DB.SCHEMA.TABLE,完全符合你的需求!
内容的提问来源于stack exchange,提问作者akshindesnowflake
相关产品推荐
相关产品推荐

