gpt4 book ai didi

regex - 不区分大小写的正则表达式

转载 作者:行者123 更新时间:2023-12-04 04:45:41 25 4
gpt4 key购买 nike

在 Haskell 中使用带有选项(标志)的正则表达式的最佳方法是什么

我用

Text.Regex.PCRE

该文档列出了一些有趣的选项,例如 compCaseless、compUTF8、...
但我不知道如何将它们与 (=~) 一起使用

最佳答案

所有Text.Regex.*模块大量使用类型类,这些类型类用于可扩展性和类似“重载”的行为,但仅从类型来看,使用就不那么明显了。

现在,您可能已经从基本的=~ 开始了。匹配器。

(=~) ::
( RegexMaker Regex CompOption ExecOption source
, RegexContext Regex source1 target )
=> source1 -> source -> target
(=~~) ::
( RegexMaker Regex CompOption ExecOption source
, RegexContext Regex source1 target, Monad m )
=> source1 -> source -> m target

使用 =~ ,必须存在 RegexMaker ... 的实例对于 LHS,和 RegexContext ...对于 RHS 和结果。
class RegexOptions regex compOpt execOpt | ...
| regex -> compOpt execOpt
, compOpt -> regex execOpt
, execOpt -> regex compOpt
class RegexOptions regex compOpt execOpt
=> RegexMaker regex compOpt execOpt source
| regex -> compOpt execOpt
, compOpt -> regex execOpt
, execOpt -> regex compOpt
where
makeRegex :: source -> regex
makeRegexOpts :: compOpt -> execOpt -> source -> regex

所有这些类的有效实例(例如 regex=RegexcompOpt=CompOptionexecOpt=ExecOptionsource=String )意味着可以编译 regexcompOpt,execOpt某种形式的选项 source . (另外,给定一些 regex 类型,正好有一个 compOpt,execOpt 集合与之相伴。不过,许多不同的 source 类型都可以。)
class Extract source
class Extract source
=> RegexLike regex source
class RegexLike regex source
=> RegexContext regex source target
where
match :: regex -> source -> target
matchM :: Monad m => regex -> source -> m target

所有这些类的有效实例(例如 regex=Regexsource=Stringtarget=Bool )意味着可以匹配 sourceregex产生 target . (给定这些特定的 targetregex 的其他有效 sourceIntMatchResult StringMatchArray 等)

把这些放在一起,很明显 =~=~~只是便利功能
source1 =~ source
= match (makeRegex source) source1
source1 =~~ source
= matchM (makeRegex source) source1

还有那个 =~=~~没有空间将各种选项传递给 makeRegexOpts .

你可以自己做
(=~+) ::
( RegexMaker regex compOpt execOpt source
, RegexContext regex source1 target )
=> source1 -> (source, compOpt, execOpt) -> target
source1 =~+ (source, compOpt, execOpt)
= match (makeRegexOpts compOpt execOpt source) source1
(=~~+) ::
( RegexMaker regex compOpt execOpt source
, RegexContext regex source1 target, Monad m )
=> source1 -> (source, compOpt, execOpt) -> m target
source1 =~~+ (source, compOpt, execOpt)
= matchM (makeRegexOpts compOpt execOpt source) source1

可以像这样使用
"string" =~+ ("regex", CompCaseless + compUTF8, execBlank) :: Bool

或覆盖 =~=~~带有可以接受选项的方法
import Text.Regex.PCRE hiding ((=~), (=~~))

class RegexSourceLike regex source
where
makeRegexWith source :: source -> regex
instance RegexMaker regex compOpt execOpt source
=> RegexSourceLike regex source
where
makeRegexWith = makeRegex
instance RegexMaker regex compOpt execOpt source
=> RegexSourceLike regex (source, compOpt, execOpt)
where
makeRegexWith (source, compOpt, execOpt)
= makeRegexOpts compOpt execOpt source

source1 =~ source
= match (makeRegexWith source) source1
source1 =~~ source
= matchM (makeRegexWith source) source1

或者你可以使用 match , makeRegexOpts等直接在需要的地方。

关于regex - 不区分大小写的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1007846/

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