gpt4 book ai didi

Scala 解析器组合器 - 消耗直到匹配

转载 作者:行者123 更新时间:2023-12-01 10:51:34 24 4
gpt4 key购买 nike

我正在使用 Scala 中的 native 解析器组合器库,我想解析输入的某些部分,而不是其他部分。具体来说,我想丢弃我关心的输入之间的所有任意文本。例如,使用此输入:

begin

Text I care about
Text I care about

DONT CARE

Text I don't care about

begin

More text I care about
...

现在我有:

object MyParser extends RegexParsers {
val beginToken: Parser[String] = "begin"
val dontCareToken: Parser[String] = "DONT CARE"
val text: Parser[String] = not(dontCareToken) ~> """([^\n]+)""".r

val document: Parser[String] = begin ~> text.+ <~ dontCareToken ^^ { _.mkString("\n") }
val documents: Parser[Iterable[String]] = document.+

但我不确定如何忽略 DONT CARE 之后和下一个 begin 之前的文本。具体来说,我不想对该文本的形式做出任何假设,我只想在下一个 begin 语句处再次开始解析。

最佳答案

你几乎成功了。解析您不关心的内容,然后什么也不做。

我添加了 dontCareTextskipDontCare 然后在您的文档解析器中指示 skipDontCare 是可选的。

import scala.util.parsing.combinator.RegexParsers   

object MyParser extends RegexParsers {
val beginToken: Parser[String] = "begin"
val dontCareToken: Parser[String] = "DONT CARE"
val text: Parser[String] = not(dontCareToken) ~> """([^\n]+)""".r
val dontCareText: Parser[String] = not(beginToken) ~> """([^\n]+)""".r
val skipDontCare = dontCareToken ~ dontCareText ^^ { case c => "" }

val document: Parser[String] =
beginToken ~> text.+ <~ opt(skipDontCare) ^^ {
_.mkString("\n")
}
val documents: Parser[Iterable[String]] = document.+
}


val s = """begin

Text I care about
Text I care about

DONT CARE

Text I don't care about

begin

More text I care about
"""

MyParser.parseAll(MyParser.documents,s)

关于Scala 解析器组合器 - 消耗直到匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19009299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com