如何编写解析器来解析 fastparse 中引用的正则表达式?

How can I compose a parser to parse a quoted regex in fastparse?

我想解析的是任何用双引号引用的正则表达式。例如,“([A-Z]+[A-Z]+[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 ""))

到目前为止我的理解是正则表达式解析器也在使用最后一个双引号。但我无法弄清楚如何避免这种情况!我想我们需要写一些前瞻性的东西,并以某种方式避免解析最后一个字符,但不确定如何做到这一点。

请帮忙。

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

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

Here在Scastie是运行。