如何使用FParsec编写匹配两种字符串模式的指定返回类型解析器
FParsec解析器优化实现
核心优化方案
你可以通过分支匹配+专用非点字符匹配的方式大幅简化代码,实现如下:
open FParsec let targetParser : Parser<(string Option * string), unit> = // 匹配连续的非点字符(至少1个) let nonDotSegment = many1Satisfy (fun c -> c <> '.') // 分支1:匹配仅含一个点的字符串,返回(Some 点前内容, 点后内容) let dottedCase = nonDotSegment .>> pstring "." .>>. nonDotSegment |>> fun (pre, post) -> Some pre, post // 分支2:匹配无点字符串,返回(None, 完整字符串) let plainCase = nonDotSegment |>> fun fullStr -> None, fullStr // 按顺序尝试两个分支 choice [dottedCase; plainCase]
实现说明
- 使用
many1Satisfy直接匹配连续非点字符,比manyChars anyChar的组合性能更好,且天然避免意外匹配点号 - 两个分支逻辑清晰,无需额外的模式匹配转换,直接映射到要求的返回类型
- 天然限制输入仅能包含0或1个点,输入多个点的场景会直接解析失败,符合需求
- 如果需要支持字符串前后带空格,可在外层包裹
spaces >>. targetParser .>> spaces即可
内容的提问来源于stack exchange,提问作者WilliamG
相关产品推荐
相关产品推荐

