如何修正正则表达式以匹配包含SQL函数的SQL子查询?
解决含SQL函数的子查询正则匹配问题
原正则表达式\(\s*select([^()]*)\)的问题在于,[^()]*会匹配到第一个右括号就终止,遇到group_concat()这类带括号的SQL函数时,会在函数的右括号处截断,无法完整匹配子查询。
调整方案(支持PCRE正则环境)
使用支持递归匹配的正则来处理嵌套括号:
\(\s*select(?:[^()]|(\((?:[^()]|(?1))*\)))*\)
正则结构说明:
\(:匹配子查询开头的左括号\s*select:匹配可选空格+select关键字(?:[^()]|(\((?:[^()]|(?1))*\)))*:核心匹配逻辑,非捕获组循环匹配两种情况:[^()]:匹配非括号的普通字符(\((?:[^()]|(?1))*\)):捕获组递归匹配嵌套括号结构,(?1)引用自身实现多层括号的嵌套匹配
这个正则可以完整匹配包含任意多层嵌套括号(如group_concat(max(id)))的SQL子查询。
兼容方案(不支持递归的环境,如JavaScript)
如果环境不支持递归正则,可以使用仅处理一层嵌套的写法(适合多数简单场景):
\(\s*select(?:[^()]|\([^()]*\))*\)
注意:该写法无法处理多层嵌套的括号(如函数内嵌套函数),仅适用于单层括号的SQL函数场景。
内容的提问来源于stack exchange,提问作者kaushik shete
相关产品推荐
相关产品推荐

