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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:06:02