首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >匹配方括号内可嵌套的文本块的正则表达式

匹配方括号内可嵌套的文本块的正则表达式
EN

Stack Overflow用户
提问于 2019-02-19 18:46:00
回答 2查看 299关注 0票数 2

我正在用scala编写一个解析器,它读取由'+','-','<','>‘和’‘的重复组成的字符串。人物。字符串还可以具有'‘和'’字符,并且在它们内部有第一组字符的重复。我需要一个正则表达式来匹配方括号内的所有内容,问题是这些方括号可以嵌套。

我已经尝试过这个正则表达式:[.*]和我在上面找到的许多其他的正则表达式,但似乎都不起作用。

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

“+++”匹配“+++”

"[++-]“应与"++-”匹配

编辑(添加用例):

“+.++-]”不应与"+++.] [++-“匹配,而应与”+++“匹配2次。”和"++-“

EN

回答 2

Stack Overflow用户

发布于 2019-02-19 19:34:48

使用单个正则表达式很难做到这一点,但是通过一些后处理,您可能会更接近。

代码语言:javascript
复制
def parse(s :String) :Array[String] = 
  "\\[(.*)\\]".r.unanchored
              .findAllMatchIn(s)
              .toArray
              .flatMap(_.group(1).split(raw"][^\[\]]+\["))

用法:

代码语言:javascript
复制
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(++[-]--, +)
票数 2
EN

Stack Overflow用户

发布于 2019-02-20 18:17:56

经过一些研究,我想我可能已经找到了解决方案,但是它在Scala中是不可用的。在我的例子中,需要一个与平衡构造匹配的递归正则表达式:

代码语言:javascript
复制
\[(?:[+-\[\]]|(?R))*\]

据我所知,scala不支持这些类型,所以如果有人需要在其他语言中使用它,我就把它留在这里。

然而,我通过以另一种方式实现解析器来解决我的问题,我只是认为拥有这样的正则表达式会是一个更简单、更流畅的解决方案。我正在实现的是一个brainfuck语言解释器,下面是我的解析器类:

代码语言:javascript
复制
class brainfuck(var pointer: Int, var array: Array[Int]) extends JavaTokenParsers {
    def Program = rep(Statement) ^^ { _ => () }     
    def Statement: Parser[Unit] = 
        "+" ^^ { _ => array(pointer) = array(pointer) + 1 } | 
        "-" ^^ { _ => array(pointer) = array(pointer) - 1 } | 
        "." ^^ { _ => println("elem: " + array(pointer).toChar) } | 
        "," ^^ { _ => array(pointer) = readChar().toInt } |         
        ">" ^^ { _ => pointer = pointer + 1 } |
        "<" ^^ { _ => pointer = pointer - 1 } |
        "[" ~> rep(block|squares) <~ "]" ^^ { items => while(array(pointer)!=0) { parseAll(Program,items.mkString) } }

    def block = 
        """[-+.,<>]""".r ^^ { b => b.toString() }           

    def squares: Parser[String] = "[" ~> rep(block|squares) <~ "]" ^^ { b => var res = "[" + b.mkString + "]"; res }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54764381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档