如何使用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
相关产品推荐
相关产品推荐

