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

Scala解析器中匹配嵌套方括号内文本的正则表达式需求

嘿,我完全懂你遇到的麻烦——嵌套方括号确实是普通正则的“硬伤”,像\[.*\]这种写法要么贪婪地从第一个[吃到最后一个],要么非贪婪但处理不了嵌套,根本满足不了你的需求。不过别担心,Scala用的是Java正则引擎,从JDK 9开始已经支持递归正则表达式,刚好能解决嵌套平衡结构的匹配问题!

解决方案:递归正则表达式

直接上能解决你问题的正则:

\[((?:[^\[\]]|(?R))*)\]

正则各部分解释:

  • \[:精准匹配开头的左方括号
  • (...):捕获组,用来提取方括号内部的内容(这正是你要的结果)
  • (?:[^\[\]]|(?R))*:非捕获组,循环匹配两种内容:
    • [^\[\]]:任意不是方括号的字符(也就是你说的+, -, <, >, .这些)
    • (?R):递归匹配整个正则表达式——简单说就是遇到嵌套的[时,重复整个匹配逻辑,完美处理嵌套结构
  • \]:匹配结尾的右方括号

Scala代码示例

把这个正则用到你的Scala代码里,提取所有匹配的内容:

import scala.util.matching.Regex

// 定义递归正则
val nestedBracketParser = """\[((?:[^\[\]]|(?R))*)\]""".r
val testInput = "[+++.] [++[-]]"

// 提取所有方括号内的内容
val results = nestedBracketParser.findAllMatchIn(testInput)
  .map(_.group(1)) // 取捕获组1的内容,也就是括号里的部分
  .toList

// 输出:List("+++.", "++[-]")
println(results)

注意事项

  1. JDK版本要求:这个正则依赖JDK 9及以上的递归语法(?R),如果你的项目还在使用JDK 8或更低版本,纯正则就搞不定了——这种情况下建议写一个简单的递归解析函数(比如遍历字符,维护括号深度),或者升级JDK版本。
  2. 精准匹配整串:如果你的输入是单独的一个带嵌套括号的字符串(比如"[++[-]]"),可以给正则加上首尾锚点,变成^\[((?:[^\[\]]|(?R))*)\]$,避免匹配到字符串中无关的部分。

这个方案完美适配你给出的所有测试用例,快去试试吧!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:48:02