我想知道如何在F#中做正则表达式或上下文无关文法。
我有一些使用F#的经验(我从来没有见过/使用过活动模式,(我在时间约束的课程中明确地把它省略了)),我在python中做过一些正则表达式,从一个糟糕的数学角度来看,我也做过正则表达式和语法。
我到处看了看,都被难住了。我对regex的MSDN文档不是很清楚。
我有点失望地发现
match str with
|a + "." + b + "." + c -> Some(a,b,c)
|[] -> None没有起作用。
我怀疑这样的效果可以通过活动模式来实现。
编辑以澄清:我想知道如何做正则表达式或上下文无关语法或两者都做
发布于 2011-06-04 20:15:57
,我对正则表达式的MSDN文档不太清楚。
对于字符串是否与正则表达式匹配的简单情况,它非常简单:
open System.Text.RegularExpressions
let r = Regex("^a*$")
r.IsMatch("a")
> val it : bool = true
r.IsMatch("b")
> val it : bool = false用所需的正则表达式替换a*。请注意,您需要在正则表达式周围使用^和$才能实现完全匹配。
我有点失望地发现这不起作用。
match str with
| a + "." + b + "." + c -> Some(a,b,c)
| [] -> NoneF#模式用于匹配和绑定嵌套的树状数据结构(代数数据类型)的一部分,而不是字符串和常规语言,这就是为什么它不起作用。
我怀疑这样的效果可以通过活动模式来实现
是的,您可以使用活动模式来实现此效果。Chris Smith有一篇文章展示了细节(由Brian最先发布)。
http://blogs.msdn.com/b/chrsmith/archive/2008/02/22/regular-expressions-via-active-patterns.aspx
我想知道如何做正则表达式或上下文无关文法,或者两者兼而有之…我用python编写了一些正则表达式,从离散数学的角度来看,我也做了一些regex和语法。
对于字符串上的匹配模式,如上所示的内置.Net正则表达式通常就足够好了。但是,请注意,尽管名称如此,但它们并不是严格意义上的常规语言,因为它们可以表示更大的语言类别。因此,它们可能并不总是像您在理论设置中所期望的那样具有时间/空间复杂性。(对于Perl/Python/等也是如此)
至于CFG,这是一个完全不同的问题。来自F# PowerPack的Fsyacc (与lexer fslex一起)是标准的F# LALR解析器生成器,它将匹配CFG的一个有用的子类。或者,您可以尝试使用来自http://www.quanttec.com/fparsec/的FParsec解析器组合器库。
发布于 2011-06-04 17:29:02
我建议你摘自Expert F#:
Using Regular expressions and formatting
它涵盖了许多基础使用的perl风格的运算符,使用f#模式匹配,活动模式等。
发布于 2011-06-04 16:15:12
这个家伙写了一篇关于如何用F#构建一个完整的正则表达式解析器的教程:
http://stevehorsfield.wordpress.com/2009/08/04/f-a-complete-regular-expression-processor/
http://stevehorsfield.wordpress.com/2009/07/25/f-building-a-regular-expression-pattern-parser/
https://stackoverflow.com/questions/6234819
复制相似问题