我正在以这种形式解析字符串记录:
description: double/double/double
代表:
item description: 0.4/8/-24.66
每条记录都应该产生一个对象:
new MyObj("first item", 0.4, 2.4, -24.66)
我可以使用正则表达式和过程方法轻松完成此操作,但生成的代码容易出错并且相当丑陋(至少从功能的角度来看)。
如何以更优雅的方式实现这一目标?
答案 0 :(得分:4)
嗯,FParsec很好:
#r "FParsecCS.dll"
#r "FParsec.dll"
open FParsec
let parser : Parser<_,unit> =
sepBy pfloat (pchar '/')
然后run parser "0.4/8/-24.66"
返回val it : ParserResult<float list,unit> = Success: [0.4; 8.0; -24.66]
。
答案 1 :(得分:2)
或者您可以像这样创建一个简单的解析器函数string->MyObj
:
type MyObj(descr:string, a:float, b:float, c:float) =
override this.ToString() =
System.String.Format("{0}: {1}; {2}; {3}", descr,a,b,c)
let myobjfromstr (str:string) =
let flds = str.Split([|':';'/'|])
let ip s = System.Double.Parse(s)
new MyObj(flds.[0], ip flds.[1], ip flds.[2], ip flds.[3])
myobjfromstr "item description: 0.4/8/-24.66" |> printfn "%A"
(更新:我猜测记录被新行或类似的东西分开并被分成一个列表。第二个想法,你的问题中没有类似的东西...... )