Java正则如何提取括号内逗号分隔的单个文本值?
解决IN子句中单引号值的提取问题
核心思路
要精准提取每个单引号包裹的值,分两步处理更稳妥:先定位所有IN (...)子句里的括号内容,再从中拆分出单个值,既能避免误抓非IN子句的内容,又能兼容各种合法的单引号值格式。
正则表达式调整方案
步骤1:匹配所有IN子句的括号内内容
用以下正则定位每个IN子句中括号里的完整值集合:
IN\s*\(\s*('[^']*(?:''[^']*)*'(?:\s*,\s*'[^']*(?:''[^']*)*')*)\s*\)
这个正则支持SQL里的单引号转义写法(比如'O''Neil'),同时能准确匹配括号内所有逗号分隔的单引号值。
步骤2:从括号内容中提取单个值
针对步骤1捕获的每个括号内字符串,用下面的正则提取独立值:
'([^']*(?:''[^']*)*)'
它会自动剥离外层单引号,同时保留值内部的转义单引号结构。
代码示例(Java为例)
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class InClauseValueExtractor { public static void main(String[] args) { String input = "id IN ('xxxxxx') AND os IN ('WIN', 'MAC', 'O''Neil')"; // 第一步:匹配所有IN子句的括号内内容 Pattern inClausePattern = Pattern.compile("IN\\s*\\(\\s*('[^']*(?:''[^']*)*'(?:\\s*,\\s*'[^']*(?:''[^']*)*')*)\\s*\\)"); Matcher inClauseMatcher = inClausePattern.matcher(input); List<String> extractedValues = new ArrayList<>(); while (inClauseMatcher.find()) { String valuesSection = inClauseMatcher.group(1); // 第二步:提取每个单引号包裹的值 Pattern valuePattern = Pattern.compile("'([^']*(?:''[^']*)*)'"); Matcher valueMatcher = valuePattern.matcher(valuesSection); while (valueMatcher.find()) { // 将SQL转义的双单引号还原为单个单引号 String cleanValue = valueMatcher.group(1).replace("''", "'"); extractedValues.add(cleanValue); } } // 输出结果 extractedValues.forEach(System.out::println); } }
运行后输出:
xxxxxx WIN MAC O'Neil
关键说明
- 分两步处理的优势:直接全局匹配单引号值可能误抓字符串中其他位置的单引号内容,先锁定IN子句范围再提取值,精准度更高。
- 转义兼容:正则中的
(?:''[^']*)*片段专门处理SQL里的单引号转义,确保不会因为值内部的单引号提前终止匹配。
内容的提问来源于stack exchange,提问作者Dust_In_The_Wind
相关产品推荐
相关产品推荐

