本文介绍如何使用java正则表达式精准提取被单引号包围的字符串,且要求该单引号闭合后紧邻空白符及英文逗号、右圆括号或右方括号,适用于解析sql-like条件表达式中的字面量。
本文介绍如何使用java正则表达式精准提取被单引号包围的字符串,且要求该单引号闭合后紧邻空白符及英文逗号、右圆括号或右方括号,适用于解析sql-like条件表达式中的字面量。
在Java中处理类似 ( $REC_REM$.cApplicationOrigin in ['AOL MOBILE','FASTWEB','POS.TE','SALES'FORCE','13'] ) 这样的结构化字符串时,若需安全提取所有单引号包裹的字面量(如 ---、AOL MOBILE、FASTWEB 等),关键在于:匹配成对单引号之间的内容,并确保右单引号后紧跟可选空白符 + ,、) 或 ]。
推荐使用的正则表达式为:
'(.+?)'\h*[,)\]]
✅ 说明与要点:
- ' 匹配字面量起始的单引号;
- (.+?) 是非贪婪捕获组,匹配任意字符(除换行符外)至少一次,确保尽可能早地遇到结束单引号;
- ' 匹配结束单引号;
- \h* 匹配零个或多个Unicode水平空白(含空格、制表符等),比 \s* 更精准,避免误吞换行;
- [,)\]] 是字符类,匹配紧接着的分隔符之一:英文逗号 ,、右圆括号 ) 或右方括号 ](注意 ] 在字符类中需转义或置于开头/结尾以避免语法错误,此处放末尾即合法)。
⚠️ 重要注意事项:
立即学习“Java免费学习笔记(深入)”;
- Java字符串中反斜杠需双写,因此 h 写作 \h,] 写作 \];
- 该正则不支持嵌套单引号(如 'SALES'FORCE'),若原始数据含转义单引号,需改用更复杂的模式(如基于平衡组的解析器,但Java原生Pattern不支持);
- 若需兼容换行符内的字面量,可将 .+? 替换为 [^']*(即“非单引号字符”),但本例中无跨行需求,[^']* 更安全防回溯爆炸;
✅ 完整Java示例代码:
import java.util.*;
import java.util.regex.*;
public class QuoteExtractor {
public static void main(String[] args) {
String input = "( $REC_REM$.cApplicationOrigin == '---' ) || ( $REC_REM$.cApplicationOrigin in ['AOL MOBILE','FASTWEB','POS.TE','SALES''FORCE','13'] )";
String regex = "'([^']*)'\h*[,)\]]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
List<String> results = new ArrayList<>();
while (matcher.find()) {
results.add(matcher.group(1)); // 获取捕获组1(单引号内内容)
}
System.out.println(results);
// 输出: [---, AOL MOBILE, FASTWEB, POS.TE, SALES'FORCE, 13]
}
}? 补充说明:
- 使用 [^']* 替代 .+? 可彻底规避因贪婪匹配导致的越界问题(例如 'abc' def' 中误匹配到第二个 ');
- 若实际数据中存在连续空格或不可见Unicode空白(如U+00A0非断空格),\h 比 \s 更可靠;
- 此方案简洁高效,适用于大多数配置解析、规则引擎字面量抽取等工业级场景。


















