regex - 正则表达式匹配可以嵌套的方括号内的文本块
问题描述
我正在scala中编写一个解析器,它读取由'+'、'-'、'<'、'>'和'.'的重复组成的字符串。人物。该字符串也可能包含“[”和“]”字符,并且在它们内部有第一组字符的重复。我需要一个匹配方括号内所有内容的正则表达式,问题是方括号可以嵌套。
我已经尝试过使用这个正则表达式: \[.*\] 以及我在 SO 上找到的许多其他内容,但似乎没有一个有效。
我正在寻找的正则表达式应该像这样工作:
"[+++.]" 匹配 "+++."
“[++[-]]”应该匹配“++[-]”
编辑(添加了一个用例):
"[+++.] [++[-]]" 不应该匹配 "+++.] [++[-]" 但 2 匹配 "+++." 和“++[-]”
解决方案
使用单个正则表达式会非常困难,但是通过一些后处理,您可能会更接近一些。
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(++[-]--, +)
推荐阅读
- html - 如何在移动设备上堆叠两个 div,但在桌面上并排排列?
- r - 计算距离并添加线条ggplot
- android - 如何“导出保存的数据并将该数据传输到 Android 中的新活动”
- html - 如何修改博客主题
- dart - 在 Flutter 中分享图片 + 文字 + url 的便捷方式
- debugging - 调试器在启动他们的被调试者时如何绕过图像文件执行选项?
- ghost-blog - Ghost API 未添加帖子正文
- javafx - 使用自定义 asString 方法将 simpleStringProperty 绑定到 simpleIntegerProperty
- reactjs - 如何为响应中的搜索编写单元测试用例
- c - 无法在 C 中编译 Windows Socket