You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:54:34