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

如何用正则表达式提取方括号与圆括号内内容并生成列表/数组?

解决方案

当然有!要同时提取方括号和圆括号内的内容(包括嵌套的括号结构),你需要使用支持平衡组/递归匹配的正则表达式——普通正则没法处理像[1[35]]或(BULK(KIN[...](MARK)))这种嵌套括号的情况。

适配Java的正则表达式

针对你的需求,我们可以写一个能匹配嵌套方括号和圆括号的正则,并且直接捕获括号内的核心内容:

\\[(?<inner>(?:[^\\[\\]]|(?R))*)\\]|\\((?<inner>(?:[^()]|(?R))*)\\)
  • (?R):表示递归匹配整个正则表达式,专门用来处理嵌套的括号结构
  • (?<inner>):命名捕获组,用来精准提取括号内的文本
  • 两部分用|分隔,分别覆盖方括号和圆括号的匹配场景

完整代码示例

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ExtractBracketContent {
    public static void main(String[] args) {
        String example = "[21](BULK(KIN[1[35]](MARK)))";
        // 匹配嵌套方括号/圆括号并捕获内部内容
        String regex = "\\[(?<inner>(?:[^\\[\\]]|(?R))*)\\]|\\((?<inner>(?:[^()]|(?R))*)\\)";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(example);
        
        // 遍历输出所有匹配到的括号内内容
        while (matcher.find()) {
            String content = matcher.group("inner");
            System.out.println(content);
        }
    }
}

运行结果

执行这段代码后,你会得到所有括号内的内容(包括嵌套层级里的):

21
BULK(KIN[1[35]](MARK))
1[35]
35
MARK

为什么你的原有正则失效?

你之前用的\\(([^)]+)\\)依赖[^)]+匹配字符,它会把第一个)作为终止符,遇到嵌套的)就会提前停止匹配。比如在你的示例里,它只能提取到BULK(KIN[1[35]](MARK,而不是完整的嵌套括号内容。递归正则(?R)则能正确识别括号的嵌套层级,匹配到最外层的闭合括号。

注意事项

  • 这个正则需要Java 9及以上版本支持,因为Java 9才引入了递归正则的语法(?R)。
  • 如果要兼容Java 8及以下版本,可以考虑手动处理嵌套逻辑,或者使用第三方正则库辅助。

内容的提问来源于stack exchange,提问作者sammyukavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:37:31