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)
注意事项
- JDK版本要求:这个正则依赖JDK 9及以上的递归语法
(?R),如果你的项目还在使用JDK 8或更低版本,纯正则就搞不定了——这种情况下建议写一个简单的递归解析函数(比如遍历字符,维护括号深度),或者升级JDK版本。 - 精准匹配整串:如果你的输入是单独的一个带嵌套括号的字符串(比如
"[++[-]]"),可以给正则加上首尾锚点,变成^\[((?:[^\[\]]|(?R))*)\]$,避免匹配到字符串中无关的部分。
这个方案完美适配你给出的所有测试用例,快去试试吧!
内容的提问来源于stack exchange,提问作者LowRez
相关产品推荐
相关产品推荐

