繁体   English   中英

当字符串可以包含该字符时,该字符串以parboiled2中的字符结尾

[英]String ending with character in parboiled2, when the string can contain that character

我在编写parboiled2解析器时遇到了一个棘手的问题,那就是我需要匹配一行字符串的一部分,该字符串的结尾用:字符标记。 这很容易,除了字符串可以包含 :字符。

目前,我已经将字符串视为一组冒号结尾的字符串并将其连接起来,但这消耗了结尾:我不希望将其作为结尾:不是字符串本身的一部分。

def address = rule { capture(oneOrMore(zeroOrMore(noneOf(":")) ~ ":")) }

我觉得我应该在此处的某处使用&(":") ,但在与非页内广告:字符匹配时,我正在努力做到这一点。

成功匹配示例(作为较长字符串的一部分):

  • localhost: -> localhost
  • 1::: -> 1::
  • ::: -> ::

不匹配:

  • :

任何建议都将受到欢迎,即使它是“您无法做到”,也可以让我停止绞尽脑汁。


上下文是在HAProxy配置文件中解析bind设置。 给定以下(简化的)案例类的有效字符串的一些示例是:

case class Bind(endpoint: Endpoint, params: Seq[String])
case class Endpoint(address: Option[String], port: Option[Int])
  • bind :80 > Bind(Endpoint(None, Some(80)), Seq())
  • bind localhost:80 > Bind(Endpoint(Some("localhost"), Some(80)), Seq())
  • bind localhost -> Bind(Endpoint(Some("localhost"), None), Seq())
  • bind :80 param1 > Bind(Endpoint(None, Some(80)), Seq("param1")))

换句话说,如果有字符串,则需要在final之前将其终止:因为这表明存在端口。 endpoint规则如下所示:

def endpoint = rule { optional(address) ~ optional(':' ~ int) ~> Endpoint }

最终,端点的可匹配字符串以空格或行的结尾终止,因此一种选择是捕获直到空格然后分别解析字符串,但是我希望在主解析器中进行解析。

我认为以下应适用于您的问题描述:

def noColons = rule { zeroOrMore(noneOf(":")) }
def colonWithNext = rule { ':' ~ &(noColons ~ ':') }
def address = rule { capture(oneOrMore(noColons).separatedBy(colonWithNext)) ~ ':' }

您的代码的问题是〜组合器的用法,因为类似A〜B的表达式仅在首先匹配A然后匹配A ~ B时才匹配,但是如果规则B 规则A的一部分,则它在B处将不匹配。涉及到这里,parboiled2解析器仅回溯替代项。

因此,在这种情况下,只有在后面紧跟着另一个字符时,才必须确保使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM