本文介绍一种基于正则表达式的灵活字符串分割方案,用于从混合格式(含空格分隔词、括号内逗号分隔项)的字符串中准确提取所有语义单元,并统一存入列表。适用于如 `"apple orange (banana ice cream, grape)"` 类场景。
在实际开发中,我们常需解析结构松散但有规律的自然语言式字符串——例如产品名称、成分列表或标签组合。题目中的字符串具有典型混合特征:主体部分由空格连接(视为一个整体词,如 "Apple Orange"),而括号内为逗号分隔的子项(如 "(Banana Ice Cream, Grape)"),且括号内允许含空格的多词项。目标是将括号前的全部前置内容(作为一个元素) 与括号内每个逗号分隔项(各自为独立元素) 合并为一个扁平列表。
推荐使用单条正则表达式实现一阶段分割,关键在于定义合理的分隔符逻辑:
合并为统一分隔符正则:
String delimiter = "\\s*,\\s*|\\s+\\(|\\)";
该正则通过 |(或)操作符组合三类边界,使 String.split() 能一次性切分出所有目标片段。注意:此方案不校验括号匹配性(如缺失 ) 时仍会按字面分割),适用于输入格式基本可信的业务场景。
完整示例代码如下:
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]
}
} ⚠️ 注意事项:
总结:对于题目所述「前置空格连接项 + 括号内逗号分隔项」的常见模式,该正则分割法简洁高效、可读性强,是兼顾开发效率与运行性能的实用选择。