我正在用scala编写一个解析器,它读取由'+','-','<','>‘和’‘的重复组成的字符串。人物。字符串还可以具有'‘和'’字符,并且在它们内部有第一组字符的重复。我需要一个正则表达式来匹配方括号内的所有内容,问题是这些方括号可以嵌套。
我已经尝试过这个正则表达式:[.*]和我在上面找到的许多其他的正则表达式,但似乎都不起作用。
我正在寻找的正则表达式应该是这样工作的:
“+++”匹配“+++”
"[++-]“应与"++-”匹配
编辑(添加用例):
“+.++-]”不应与"+++.] [++-“匹配,而应与”+++“匹配2次。”和"++-“
发布于 2019-02-19 19:34:48
使用单个正则表达式很难做到这一点,但是通过一些后处理,您可能会更接近。
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(++[-]--, +)
发布于 2019-02-20 18:17:56
经过一些研究,我想我可能已经找到了解决方案,但是它在Scala中是不可用的。在我的例子中,需要一个与平衡构造匹配的递归正则表达式:
\[(?:[+-\[\]]|(?R))*\]
据我所知,scala不支持这些类型,所以如果有人需要在其他语言中使用它,我就把它留在这里。
然而,我通过以另一种方式实现解析器来解决我的问题,我只是认为拥有这样的正则表达式会是一个更简单、更流畅的解决方案。我正在实现的是一个brainfuck语言解释器,下面是我的解析器类:
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 }
}
https://stackoverflow.com/questions/54764381
复制相似问题