.net 解析F中分隔符分隔的值

.net 解析F中分隔符分隔的值,.net,parsing,f#,text-parsing,.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) 我可以很容易地用正则表达式和过程方法来实现这一点,但生成的代码容易出错,至少从函数的角度来看相当难看 如何以更优雅的方式实现这一点?好吧,FParsec很好: #r "FParsecCS.dll" #r "FPa

我正在分析此表单中的字符串记录:

description: double/double/double
例如:

item description: 0.4/8/-24.66
每个记录应产生一个对象:

new MyObj("first item", 0.4, 2.4, -24.66)
我可以很容易地用正则表达式和过程方法来实现这一点,但生成的代码容易出错,至少从函数的角度来看相当难看

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

好吧,FParsec很好:

#r "FParsecCS.dll"
#r "FParsec.dll"

open FParsec

let parser : Parser<_,unit> =
    sepBy pfloat (pchar '/')

然后运行解析器0.4/8//-24.66返回val-it:ParserResult=Success:[0.4;8.0;-24.66]。

或者您可以创建一个简单的解析器函数字符串->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"

更新:我猜记录被一个新行或类似的东西隔开,并被分成一个列表。再想一想,你的问题中没有类似的内容…

看起来不错,只是我还需要记录的第一部分,冒号之前的字符串。我还对不使用外部LIB的解决方案感兴趣。对于第一部分,您可以执行许多字符notAnyOf[':']。>>skipChar':'。对于不使用外部libs,不要使用FParsec:简单但有效,我喜欢它!记录之间用换行符分隔,很抱歉没有提及。@FrancescoDeVittori,还值得注意的是,可以创建一个类似string->seq的函数,这是非常F-esque的函数。另外,Don Syme在他的书中写道,您不应该害怕可变字段和过程方法,只要它能给您必要的性能提升,并且很好地隐藏在函数或类型中。。。希望这有帮助。