gpt4 book ai didi

regex - F# 正则表达式匹配链

转载 作者:行者123 更新时间:2023-12-04 00:06:58 24 4
gpt4 key购买 nike

由于我对 F# 的正则表达式实现并不完全满意,因此我想实现一个所谓的 正则表达式链。它基本上是这样工作的:

将检查给定的字符串 s 是否匹配第一个模式。如果是,它应该执行与第一个模式相关的函数。如果没有,它应该继续下一个。

我尝试如下实现:

let RegexMatch ((s : string, c : bool), p : string, f : GroupCollection -> unit) =
if c then
let m = Regex.Match(s, p)
if m.Success then
f m.Groups
(s, false)
else (s, c)
else (s, c)


("my input text", true)
|> RegexMatch("pattern1", fun g -> ...)
|> RegexMatch("pattern2", fun g -> ...)
|> RegexMatch("pattern3", fun g -> ...)
|> .... // more patterns
|> ignore

问题是,此代码无效,因为正向管道运算符似乎不管道元组或不喜欢我的实现“设计”。

我的问题是:我可以轻松地修复上面的代码还是应该实现一些其他类型的正则表达式链?

最佳答案

您的函数 RegexMatch 不支持管道,因为它具有元组参数。

首先看一下管道的定义:

let (|>) x f = f x

从这里可以清楚地看到这个表达式:

("text", true)
|> RegexMatch("pattern", fun x -> ...)

相当于这样:

RegexMatch("pattern", fun x -> ...) ("text", true)

这与您的函数签名匹配吗?明显不是。在您的签名中,text/bool 对位于第一位,并且是三元组参数的一部分,与模式和函数一起。

要使其工作,您需要采用柯里化(Currying)形式的“管道”参数和最后一个:

let RegexMatch p f (s, c) = ...

然后你可以做管道:

("input", true)
|> RegexMatch "pattern1" (fun x -> ...)
|> RegexMatch "pattern2" (fun x -> ...)
|> RegexMatch "pattern3" (fun x -> ...)

顺便说一句,我必须指出你的方法不是很,咳咳,功能。您将整个逻辑建立在副作用上,这将使您的程序不可组合且难以测试,并且可能容易出现错误。您没有获得 F# 的好处,而是有效地将其用作“具有更好语法的 C#”。

此外,实际上还有一些经过充分研究的方法可以实现您想要的。一,查看Railway-oriented programming (也称为一元计算)。

关于regex - F# 正则表达式匹配链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38445118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com