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

时间:2019-02-19 10:46:00

标签: regex scala

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

我已经尝试过此正则表达式:\ [。* \]和我在SO上发现的许多其他正则表达式,但似乎都没有用。

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

“ [+++。]”匹配“ +++”。

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

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

“ [+++。] [++ [-]]”不应该与“ +++”相匹配。] [++ [-]”但必须与“ +++”相匹配2个。和“ ++ [-]”

2 个答案:

答案 0 :(得分: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(++[-]--, +)

答案 1 :(得分:0)

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

\[(?:[+-\[\]]|(?R))*\]

据我所知,scala不支持这种类型,因此,如果有人需要其他语言,就将其留在这里。

但是,我通过以另一种方式实现解析器解决了我的问题,我只是认为拥有这样的正则表达式将是一个更简单,更流畅的解决方案。 我正在实现的是一个脑力激荡的语言解释器,这是我的解析器类:

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 }

}