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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:06:05