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

Regex 如何编写解析器来解析fastparse中引用的正则表达式?,regex,scala,fastparse,Regex,Scala,Fastparse,我想解析的是任何用双引号引用的正则表达式。例如,“([A-Z]+[A-Z]+[C])” 到目前为止,我使用fastparse库在Scala中尝试了以下内容: def regex[_: P]: P[Unit] = P(AnyChar.rep).log def quotedRegex[_: P]: P[Unit] = P("\"" ~ regex ~ "\"").log val Parsed.Failure(label, in

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

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

  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

它正在Scastie中运行。

感谢您的回复@user。此解决方案似乎大部分都有效,但无法捕获双QOUTE是正则表达式的一部分时的场景。例如,如果正则表达式是
/”((?:“|[^])*)/
,那么qouted正则表达式将是
“/”((?:“|[^])*)/“
。这就是为什么我在问题中明确要求去掉最后一个qoute。等待您的回复!TIA@ShivamKapoor我不明白。如果正则表达式被双引号包围,但也包含双引号,那么如何知道双引号是正则表达式的一部分还是字符串的结尾?例如,
“/”(((?:“[^”])*)“/”
可以解释为
“/”
“/”(?:“
”/”((?:”
)等。是否保证在第一个双引号之后和最后一个双引号之前也有正斜杠?让我向您展示我打算解析的dsl->
REGEX({EvtApplication.Event Text},“(\d\d\d\d)“)
。引号中的正则表达式也可以包含一个双qoute。我需要的是像这样单独提取这个正则表达式
(\d\d\d)
。dsl中没有字符转义。@ShivamKapoor所以在正则表达式的末尾,保证有一个
?如果是这样,你可以很容易地使用
!“\”)
@ShivamKapoor那么恐怕无法解析。无法判断引号是正则表达式的一部分还是在末尾。您必须转义正则表达式或以不同的方式标记结尾(
“”“
/
可能)