
本文介绍一种基于正则表达式的灵活字符串分割方案,用于从混合格式(含空格分隔词、括号内逗号分隔项)的字符串中准确提取所有语义单元,并统一存入列表。适用于如 `"apple orange (banana ice cream, grape)"` 类场景。
在实际开发中,我们常需解析结构松散但有规律的自然语言式字符串——例如产品名称、成分列表或标签组合。题目中的字符串具有典型混合特征:主体部分由空格连接(视为一个整体词,如 "Apple Orange"),而括号内为逗号分隔的子项(如 "(Banana Ice Cream, Grape)"),且括号内允许含空格的多词项。目标是将括号前的全部前置内容(作为一个元素) 与括号内每个逗号分隔项(各自为独立元素) 合并为一个扁平列表。
推荐使用单条正则表达式实现一阶段分割,关键在于定义合理的分隔符逻辑:
- 匹配英文逗号(忽略前后空格):\s*,\s*
- 匹配左括号及其前导空格(作为分隔起点):\s+\(
- 匹配右括号(作为分隔终点):\)
合并为统一分隔符正则:
String delimiter = "\\s*,\\s*|\\s+\\(|\\)";
该正则通过 |(或)操作符组合三类边界,使 String.split() 能一次性切分出所有目标片段。注意:此方案不校验括号匹配性(如缺失 ) 时仍会按字面分割),适用于输入格式基本可信的业务场景。
立即学习“Java免费学习笔记(深入)”;
完整示例代码如下:
import java.util.*;
public class StringSplitter {
public static List extractTerms(String input) {
if (input == null || input.trim().isEmpty()) {
return Collections.emptyList();
}
String delimiter = "\\s*,\\s*|\\s+\\(|\\)";
return Arrays.stream(input.split(delimiter))
.map(String::trim)
.filter(s -> !s.isEmpty())
.toList(); // Java 16+;若用低版本可替换为 .collect(Collectors.toList())
}
public static void main(String[] args) {
String k1 = "Apple";
String k2 = "Apple Orange";
String k3 = "Apple (Banana, Orange, Grape)";
String k4 = "Apple Orange (Banana, Grape)";
String k5 = "Apple Orange (Banana Ice cream, Grape)";
System.out.println(extractTerms(k1)); // [Apple]
System.out.println(extractTerms(k2)); // [Apple Orange]
System.out.println(extractTerms(k3)); // [Apple, Banana, Orange, Grape]
System.out.println(extractTerms(k4)); // [Apple Orange, Banana, Grape]
System.out.println(extractTerms(k5)); // [Apple Orange, Banana Ice cream, Grape]
}
} ⚠️ 注意事项:
- 该方法依赖括号和逗号的字面存在,不支持嵌套括号(如 (A (B, C), D));若需处理复杂嵌套,应改用状态机或专用解析器(如 ANTLR)。
- 所有空格被统一清理(.trim()),确保结果无冗余空白;若需保留原始空格格式,请移除 .map(String::trim) 步骤。
- 若输入可能含转义字符(如 \(),需增强正则以跳过转义序列,此时建议改用 Pattern + Matcher 迭代匹配更稳妥。
总结:对于题目所述「前置空格连接项 + 括号内逗号分隔项」的常见模式,该正则分割法简洁高效、可读性强,是兼顾开发效率与运行性能的实用选择。










