1

我希望解析的是用双引号引用的任何正则表达式。例如,“([AZ]+[AZ]+[C])”

到目前为止,我在 Scala 中使用 fastparse 库尝试过以下内容:

  def regex[_: P]: P[Unit] = P(AnyChar.rep).log
  def quotedRegex[_: P]: P[Unit] = P("\"" ~ regex ~ "\"").log

  val Parsed.Failure(label, index, extra) = parse(""""str"""", quotedRegex(_))

但这会引发异常:

+quotedRegex:1:1, cut
  +regex:1:2, cut
  -regex:1:2:Success(1:6, cut)
-quotedRegex:1:1:Failure(quotedRegex:1:1 / "\"":1:6 ..."\"str\"", cut)
label = "\""
index = 5
trace = TracedFailure((any-character | "\""),(any-character | "\""),Parsed.Failure(Expected "\"":1:6, found ""))

到目前为止我所理解的是,正则表达式解析器也在使用最后一个双引号。但我无法弄清楚如何避免这种情况!我认为我们需要编写某种前瞻,并以某种方式避免解析最后一个字符,但不确定如何执行此操作。

请帮忙。

4

1 回答 1

1

要进行负前瞻,请使用!. 它将确保下一个字符不是双引号,但实际上不会消耗任何东西,就像普通正则表达式中的负前瞻一样。然后你可以匹配AnyChar或其他一些模式。

def regex[_: P]: P[Unit] = P((!"\"" ~ AnyChar).rep).log

它在 Scastie 运行

于 2020-11-15T22:23:00.850 回答