如何通过Java正则提取SQL语句中的AND条件(含特殊场景)
解决SQL语句中忽略字符串内AND的条件拆分问题
遇到这种字符串常量中包含分隔符(AND)的拆分场景,直接用简单的and拆分肯定会出错——因为正则不知道哪些and是条件分隔符,哪些是字符串内容的一部分。我们需要写一个能识别SQL字符串常量、只拆分不在单引号内的AND的正则表达式。
解决方案代码
import java.util.regex.Pattern; public class SQLConditionExtractor { public static void main(String[] args) { String inputSQL = "And tbl.col1='Jim And Tom' and tbl.col2 like '%Test' AND tbl.col3 >='2018-12-12' And tbl.col4 Like 'what''s this'"; // 核心正则:匹配不在SQL字符串常量内的AND(支持转义单引号) Pattern splitPattern = Pattern.compile( "\\s*and\\s*(?=(?:[^']|'[^']*(?:''[^']*)*')*$)", Pattern.CASE_INSENSITIVE ); String[] conditions = splitPattern.split(inputSQL); // 过滤开头空字符串(因为原SQL以And开头),输出结果 for (String cond : conditions) { String trimmedCond = cond.trim(); if (!trimmedCond.isEmpty()) { System.out.println(trimmedCond); } } } }
运行后会输出你预期的结果:
tbl.col1='Jim And Tom' tbl.col2 like '%Test' tbl.col3 >='2018-12-12' tbl.col4 Like 'what''s this'
正则原理详解
这个正则的关键是正向预查部分,用来确保当前匹配的and不在任何字符串常量内部:
\\s*and\\s*:匹配前后带任意空格的and,CASE_INSENSITIVE标志忽略大小写(支持And/AND等写法)(?=(?:[^']|'[^']*(?:''[^']*)*')*$):正向预查,验证从当前位置到字符串结尾的所有字符中,单引号都是成对出现的(包括SQL中用两个单引号转义的情况):[^']:匹配非单引号的普通字符'[^']*(?:''[^']*)*':匹配完整的SQL字符串常量,支持内部的转义单引号(比如'what''s this')
注意事项
- 原SQL如果以
And/and开头,split后会产生一个空字符串,需要过滤掉。 - 这个方案不处理SQL注释中的
and,如果你的SQL包含注释(比如/* 这里有个And */),需要先去除注释再执行拆分。 - 只支持单引号包裹的字符串常量,如果你需要处理双引号的情况,可以把正则中的
'替换成['"],同时调整内部的匹配逻辑。
内容的提问来源于stack exchange,提问作者aqiao
相关产品推荐
相关产品推荐

