【发布时间】:2021-10-23 14:12:04
【问题描述】:
我正在尝试学习 FParsec 并尝试匹配两个模式中的字符串。
该字符串可以是普通字符串,如"string",也可以是一个包含一个点的字符串,如"st.ring"。
解析器应如下所示:Parser<(string Option * string),unit>。第一个字符串是可选的,具体取决于字符串是否被点分隔。可选字符串表示"."之前的字符串部分。
我尝试了一些不同的方法,但我觉得这次尝试已经结束了:
let charstilldot = manyCharsTill anyChar (pstring ".")
let parser = opt(charstilldot) .>>. (many1Chars anyChar)
这适用于"st.ring" 这样的输入,但不适用于"string",因为后者中不存在点。
我会非常感谢您的帮助,谢谢!
编辑: 我有一个解决方案,它基本上按顺序解析参数并根据它们在字符串中是否是点来交换参数
let colTargetWithoutDot : Parser<string Option,unit> = spaces |>> fun _ -> None
let colTargetWithDot = (pstring "." >>. alphastring) |>> Some
let specificColumn = alphastring .>>. (colTargetWithDot <|> colTargetWithoutDot) |>> (fun (h,t) ->
match h,t with
| h,None -> (None,h)
| h,Some(t) -> (Some(h),t))
但是这并不漂亮,所以我仍然会申请另一个解决方案!
【问题讨论】: