[英]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.