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

Java正则表达式解析:按括号匹配次数提取目标内容

解决嵌套括号的分步匹配问题

嘿,你遇到的核心问题其实是普通正则搞不定嵌套结构——你用的\{(.*?)\}是表层的非贪婪匹配,没法识别括号的嵌套层级,自然拿不到按闭合次数提取的结果。

要实现你要的「按括号匹配次数提取内容」,咱们换个思路:手动数括号的层级,遍历字符串追踪每一次闭合的位置就好,具体来一步步看:


先理清楚你的需求逻辑

你要的是:

  • 第1次匹配:从最外层的{开始,到第1个真正闭合的}(也就是AAAA后面那个),提取中间的内容 → 结果是HHH { AAAA
  • 第2次匹配:从最外层{开始,到第2个闭合的}(fS后面那个),提取内容 → 结果是HHH { AAAA } fS

用计数法实现(最通用的方案)

这里拿Python举例子,思路很简单:遍历字符串的时候统计{和}的数量,每遇到一个}就检查是不是我们要的第n次闭合,是的话就截取内容:

def get_content_by_bracket_close_count(input_str, target_close_times):
    # 先找到最外层起始的{位置
    start_pos = input_str.find('{')
    if start_pos == -1:
        return "没找到起始括号"
    
    bracket_level = 1  # 已经找到一个{,初始层级为1
    target_reached = False
    end_pos = -1
    
    for idx in range(start_pos + 1, len(input_str)):
        char = input_str[idx]
        if char == '{':
            bracket_level += 1
        elif char == '}':
            bracket_level -= 1
            # 每闭合一次,就离目标近一步
            if bracket_level == 0:
                target_close_times -= 1
                if target_close_times == 0:
                    end_pos = idx
                    target_reached = True
                    break
    if not target_reached:
        return f"没找到第{target_close_times}次闭合的括号"
    
    # 提取起始{之后到end_pos之前的内容
    return input_str[start_pos + 1 : end_pos]

# 测试你的输入字符串
test_str = "{HHH { AAAA } fS } SFS}"
print(get_content_by_bracket_close_count(test_str, 1))  # 输出: HHH { AAAA
print(get_content_by_bracket_close_count(test_str, 2))  # 输出: HHH { AAAA } fS

为啥你的正则不行?

你的\{(.*?)\}{1}用了非贪婪匹配,它会匹配从第一个{到最近的那个},也就是整个匹配串是{HHH { AAAA },分组提取的是HHH { AAAA——这其实刚好是你要的第1次结果,但要提取第2次的话,正则就懵了,因为它没法区分哪个}是第2次有效的闭合(毕竟中间还有嵌套的{})。

如果非要用正则(仅限支持递归正则的语言,比如Python),可以写递归正则来匹配指定层级,但灵活性很差,比如要匹配第2次闭合,得这么写:

import re

test_str = "{HHH { AAAA } fS } SFS}"
# 匹配包含1层嵌套括号的内容
pattern = r'\{(.*?(?:\{.*?\}){1}.*?)\}'
match_result = re.search(pattern, test_str)
if match_result:
    print(match_result.group(1))  # 输出: HHH { AAAA } fS

但这个方法的问题是,你要匹配第n次,就得手动把{1}改成{n-1},而且只适用于固定嵌套深度的场景,远不如计数法好用。


总的来说,处理嵌套括号的分步匹配,手动计数追踪层级是最靠谱、最灵活的办法,正则只适合简单的非嵌套场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:35:28