Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Scala正则表达式多行匹配具有负前瞻性_Regex_Scala_Regex Lookarounds - Fatal编程技术网

Regex Scala正则表达式多行匹配具有负前瞻性

Regex Scala正则表达式多行匹配具有负前瞻性,regex,scala,regex-lookarounds,Regex,Scala,Regex Lookarounds,我正在使用Scala的解析器组合器编写DSL。我最近将我的基类从StandardTokenParsers更改为JavaTokenParsers,以利用我认为最后一个难题所需的正则表达式特性。(见附件) 我试图做的是提取由一些字符分隔的文本块({{和})。此文本块可以跨多行。到目前为止,我得到的是: def docBlockRE = regex("""(?s)(?!}}).*""".r) def docBlock: Parser[DocString] = "{{" ~>

我正在使用Scala的解析器组合器编写DSL。我最近将我的基类从StandardTokenParsers更改为JavaTokenParsers,以利用我认为最后一个难题所需的正则表达式特性。(见附件)

我试图做的是提取由一些字符分隔的文本块(
{{
}
)。此文本块可以跨多行。到目前为止,我得到的是:

  def docBlockRE = regex("""(?s)(?!}}).*""".r)
  def docBlock: Parser[DocString] =
      "{{" ~> docBlockRE <~ "}}" ^^ { case str => new DocString(str) }}
我不知道为什么会失败。如果我在解析器()周围放置一个Deubg包装,并在解析器()周围放置一个调试包装,我会得到以下结果:

{{
abc
}}

{{
abc
}}
docBlock.apply for token 
   at position 10.2 offset 165 returns [19.1] failure: `}}' expected but end of source found
如果我尝试使用多行分隔的单个块:

{{
abc
def
}}
然后,它也无法使用以下命令进行解析:

docBlock.apply for token 
  at position 10.2 offset 165 returns [16.1] failure: `}}' expected but end of source found
如果我删除DOTALL指令
(?s)
,那么我可以解析多个单行块(这对我帮助不大)

有没有办法将多行正则表达式与负前瞻相结合


这种方法的另一个问题是,无论我做什么,结束分隔符都必须与文本分开。否则,我会收到与上面看到的相同类型的错误消息。这几乎像是否定的前瞻并没有像我期望的那样工作。

要匹配
{{{整个括号}
,请使用以下正则表达式:

(?s)\{\{.*?\}\}
在中查看比赛

要匹配{{
在括号内
},请使用以下命令:

(?s)(?<=\{\{).*?(?=\}\})
(?s)(?在上下文中:

scala> val rr = """(?s).*?(?=}})""".r
rr: scala.util.matching.Regex = (?s).*?(?=}})

scala> object X extends JavaTokenParsers {val r: Parser[String] = rr; val b: Parser[String] = "{{" ~>r<~"}}" ^^ { case s => s } }
defined object X

scala> X.parseAll(X.b, """{{ abc
     | def
     | }}""")
res15: X.ParseResult[String] =
[3.3] parsed: abc
def
“向前看”的意思是“确保它跟随我,但不要消耗它。”


负前瞻只是指确保它不会跟随我。

谢谢。我会看看这个。我过去经常处理正则表达式。它们在过去10年左右似乎发生了很大变化,我没有跟上。这和som snytt的答案都比我提出的更好。好吧,如果您有问题,请告诉我。:)非常感谢。我忘记了。*的贪婪,它吞噬了我所有的文本,包括结束分隔符。我以为负面展望会解决这个问题,但事实并非如此。非消费性前瞻有点令人困惑。我想我必须重新思考为什么消极前瞻不起作用而积极前瞻起作用。
scala> val rr = """(?s)(.*?)(?=}})""".r.unanchored
rr: scala.util.matching.UnanchoredRegex = (?s)(.*?)(?=}})

scala> def f(s: String) = s match { case rr(x) => x case _ => "(none)" }
f: (s: String)String

scala> f("something }} }}")
res3: String = "something "

scala> val rr = """(?s)(.*)(?=}})""".r.unanchored
rr: scala.util.matching.UnanchoredRegex = (?s)(.*)(?=}})

scala> def f(s: String) = s match { case rr(x) => x case _ => "(none)" }
f: (s: String)String

scala> f("something }} }}")
res4: String = "something }} "