使用[.]+替代.+时正则表达式失效的原因咨询
正则解析SQL SELECT语句的问题解答
为啥[.]+不能替代(.+)?
正则里的方括号[]是字符集,这里面的.就是个普通字符,不再是“匹配任意非换行字符”的通配符。简单说:
(.+)里的.能匹配除换行外的任何字符;[.]+只能匹配连续的.点号,你的SQL里根本没这东西,自然匹配失败。
怎么让正则匹配带换行的SELECT列?
给你两个实用方案:
方案1:用[\s\S]+?覆盖所有字符(含换行)
把原来的(.+)换成([\s\S]+?),注意加个?用非贪婪模式,不然会把from甚至where的内容也吞进去。修改后的代码:
const regex = /((select[\s]*([\s\S]+?))(from(.+))(where(.+)))/; const a = 'select a,\nb from c, d where e'; const result = regex.exec(a); console.log(result[3]); // 输出 'a,\nb'
[\s\S]是“空白字符+非空白字符”的组合,等于匹配所有字符,包括换行。同理用[\d\D]+?或[\w\W]+?也行,效果完全一致。
方案2:用ES2018的dotAll修饰符s
现在JS里可以给正则加s修饰符,让.能匹配换行符。直接给原正则加s,再把(.+)改成(.+?)就行:
const regex = /((select[\s]*(.+?))(from(.+))(where(.+)))/s; const a = 'select a,\nb from c, d where e'; const result = regex.exec(a); console.log(result[3]); // 输出 'a,\nb'
这个写法更简洁,前提是你的运行环境支持ES2018及以上(现在大部分浏览器和Node.js都支持)。
额外提醒
用正则解析SQL其实是个偷懒的办法,遇到复杂SQL(比如嵌套查询、字符串里包含from/where关键字)肯定会翻车。如果是正经生产环境,建议用专门的SQL解析库,比正则靠谱多了。
内容的提问来源于stack exchange,提问作者Wagner_Cateb
相关产品推荐
相关产品推荐

