如何编写解析器来解析 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是运行。
我想解析的是任何用双引号引用的正则表达式。例如,“([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是运行。