首页 > 解决方案 > 正则表达式匹配可以嵌套的方括号内的文本块

问题描述

我正在scala中编写一个解析器,它读取由'+'、'-'、'<'、'>'和'.'的重复组成的字符串。人物。该字符串也可能包含“[”和“]”字符,并且在它们内部有第一组字符的重复。我需要一个匹配方括号内所有内容的正则表达式,问题是方括号可以嵌套。

我已经尝试过使用这个正则表达式: \[.*\] 以及我在 SO 上找到的许多其他内容,但似乎没有一个有效。

我正在寻找的正则表达式应该像这样工作:

"[+++.]" 匹配 "+++."

“[++[-]]”应该匹配“++[-]”

编辑(添加了一个用例):

"[+++.] [++[-]]" 不应该匹配 "+++.] [++[-]" 但 2 匹配 "+++." 和“++[-]”

标签: regexscala

解决方案


使用单个正则表达式会非常困难,但是通过一些后处理,您可能会更接近一些。

def parse(s :String) :Array[String] = 
  "\\[(.*)\\]".r.unanchored
              .findAllMatchIn(s)
              .toArray
              .flatMap(_.group(1).split(raw"][^\[\]]+\["))

用法:

parse("+++.]")           //res0: Array[String] = Array()
parse("[+++.]")          //res1: Array[String] = Array("+++.")
parse("[++[-]]")         //res2: Array[String] = Array("++[-]")
parse("[+++.] [++[-]]")  //res3: Array[String] = Array("+++.", "++[-]")
parse("[++[-]--] [+]")   //res4: Array[String] = Array(++[-]--, +)

推荐阅读