You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FParsec正确解析固定字符串,避免匹配到更长的相似输入

问题原因

  • 初始解析器匹配nulls成功:FParsec 解析器默认仅校验输入前缀是否匹配,只要前缀符合规则就返回成功,不会自动检查是否消费完所有输入,也不会校验关键字后续的边界合法性。
  • 加>>. spaces无效:spaces解析器允许匹配0个或多个空白字符,无论null后面是否跟空白,都可以通过匹配0个空白通过校验,等于没有加限制。
  • manyMinMaxSatisfyL版本全部报错:你先调用manyMinMaxSatisfyL 4 4 isLower消费了前4个小写字符,再尝试执行pstring "null"匹配时,已经没有剩余字符可以匹配目标字符串,逻辑完全错位。

正确实现

根据你的需求选择对应方案:

方案1:要求整个输入完全为null,无其他多余字符

直接在解析器末尾追加eof校验,确保消费完所有输入:

let jnull : Parser<Json, unit> = stringReturn "null" JNull .>> eof

测试效果:

  • 输入null:返回Success: JNull
  • 输入nulls/null :返回失败

方案2:作为JSON关键字解析,允许null后跟随空白/JSON合法分隔符

校验null后面不能跟随字母,再处理后续空白即可:

let jnull : Parser<Json, unit> =
    stringReturn "null" JNull
    // 校验下一个字符不是字母,输入末尾时也满足该条件
    .>> nextCharSatisfiesNot (System.Char.IsLetter)
    // 可选:消费后续的空白字符
    .>> spaces

测试效果:

  • 输入null/null /null,:返回成功
  • 输入nulls:返回失败

内容的提问来源于stack exchange,提问作者Roald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:15:04