如何用Java正则从括号处分割化学分子式,如将Ca(OH)2拆为Ca和(OH)2
问题原因
Java 的 String.split() 方法设计和 Python 的 re.split 逻辑不同:即使正则表达式中包含捕获组,Java 的 split 也不会将捕获到的分隔符内容插入返回的结果数组中,只会用匹配到的内容作为切割边界切分原字符串。
你原来的写法中,(OH)2 被识别为分隔符直接丢弃,同时 Java split 默认参数会丢弃末尾的空字符串,因此最终输出只有 [Ca]。
解决方案
改用 Pattern + Matcher 遍历匹配所有需要的片段即可,代码实现如下:
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ChemicalSplitter { public static void main(String[] args) { String compound = "Ca(OH)2"; // 正则兼容原有逻辑,同时匹配普通元素段和括号带后缀的段 Pattern pattern = Pattern.compile("\\([A-Za-z0-9]*\\)[0-9]*|[A-Za-z0-9]+"); Matcher matcher = pattern.matcher(compound); List<String> segments = new ArrayList<>(); while (matcher.find()) { segments.add(matcher.group()); } // 如需和Python输出完全一致,保留末尾的空字符串,可添加以下判断 if (compound.matches(".*\\([A-Za-z0-9]*\\)[0-9]*$")) { segments.add(""); } System.out.println(segments); } }
运行输出和Python实现效果完全一致:[Ca, (OH)2, ]
内容的提问来源于stack exchange,提问作者Croissant
相关产品推荐
相关产品推荐

