在F#中解析分隔符分隔的值

时间:2011-09-20 12:28:10

标签: .net parsing f# text-parsing

我正在以这种形式解析字符串记录:

description: double/double/double

代表:

item description: 0.4/8/-24.66

每条记录都应该产生一个对象:

new MyObj("first item", 0.4, 2.4, -24.66)

我可以使用正则表达式和过程方法轻松完成此操作,但生成的代码容易出错并且相当丑陋(至少从功能的角度来看)。

如何以更优雅的方式实现这一目标?

2 个答案:

答案 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"

更新:我猜测记录被新行或类似的东西分开并被分成一个列表。第二个想法,你的问题中没有类似的东西...... )