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

如何在Java中使用正则表达式提取括号间的子字符串?

嘿,这个需求我之前做项目的时候刚好碰到过,用Java正则提取括号里的内容其实挺灵活的,得根据你的具体场景来选写法,我给你一步步拆解:

提取单个括号对中的内容

就像你举的例子abc(de)gh,要精准拿到de,核心思路是用正则捕获组锁定括号里的内容。对应的正则表达式是\\((.*?)\\),这里的细节得注意:

  • \\( 和 \\):因为括号在正则里是用来定义捕获组的特殊字符,所以必须用反斜杠转义才能匹配实际的括号
  • (.*?):这是一个非贪婪的捕获组,.*?会匹配任意字符,直到遇到第一个右括号就停止,刚好能拿到括号里的内容

直接上可运行的Java代码:

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

public class BracketExtractor {
    public static void main(String[] args) {
        String input = "abc(de)gh";
        // 编译正则表达式
        Pattern pattern = Pattern.compile("\\((.*?)\\)");
        Matcher matcher = pattern.matcher(input);
        
        // 找到匹配项后,取第一个捕获组的内容
        if (matcher.find()) {
            String extracted = matcher.group(1);
            System.out.println(extracted); // 输出: de
        }
    }
}
处理多个括号对的场景

如果你的字符串里有多个括号,比如abc(de)fg(hi)jk,要把所有括号里的内容都提取出来,只需要循环调用matcher.find()就行:

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

public class MultiBracketExtractor {
    public static void main(String[] args) {
        String input = "abc(de)fg(hi)jk";
        Pattern pattern = Pattern.compile("\\((.*?)\\)");
        Matcher matcher = pattern.matcher(input);
        
        List<String> results = new ArrayList<>();
        // 循环查找所有匹配项
        while (matcher.find()) {
            results.add(matcher.group(1));
        }
        
        System.out.println(results); // 输出: [de, hi]
    }
}
特殊情况:嵌套括号

如果遇到嵌套括号的场景,比如abc(de(fg)hi)jk,上面的非贪婪正则就会失效(会只拿到de(fg),因为正则本身不支持递归匹配嵌套结构。这种情况更稳妥的做法是用手动解析(比如借助栈):

public class NestedBracketExtractor {
    public static String extractNestedContent(String input) {
        int startIndex = input.indexOf('(');
        if (startIndex == -1) {
            return ""; // 没有括号直接返回空
        }
        
        int bracketCount = 1;
        int endIndex = startIndex + 1;
        
        // 遍历字符串,统计括号数量,找到匹配的右括号
        while (endIndex < input.length() && bracketCount > 0) {
            char currentChar = input.charAt(endIndex);
            if (currentChar == '(') {
                bracketCount++;
            } else if (currentChar == ')') {
                bracketCount--;
            }
            endIndex++;
        }
        
        // 截取括号之间的内容
        return input.substring(startIndex + 1, endIndex - 1);
    }

    public static void main(String[] args) {
        String input = "abc(de(fg)hi)jk";
        System.out.println(extractNestedContent(input)); // 输出: de(fg)hi
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:30:43