我正在Scala中编写一个解析器,该解析器读取由重复的'+','-','<','>'和'。组成的字符串。字符。该字符串也可以包含'['和']'字符,并且在其中包含第一组字符的重复。 我需要一个与方括号内的所有内容都匹配的正则表达式,问题是方括号可以嵌套。
我已经尝试过此正则表达式:\ [。* \]和我在SO上发现的许多其他正则表达式,但似乎都没有用。
我正在寻找的正则表达式应该像这样工作:
“ [+++。]”匹配“ +++”。
“ [++ [-]]”应匹配“ ++ [-]”
编辑(添加了一个用例):
“ [+++。] [++ [-]]”不应该与“ +++”相匹配。] [++ [-]”但必须与“ +++”相匹配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 }
}