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

Gae*_*bar 8 regex haskell case-insensitive

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

我用

Text.Regex.PCRE
Run Code Online (Sandbox Code Playgroud)

文档列出了一些有趣的选项,如compCaseless,compUTF8,...但我不知道如何使用它们(=〜)

eph*_*ent 18

所有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
Run Code Online (Sandbox Code Playgroud)

要使用=~,必须存在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
Run Code Online (Sandbox Code Playgroud)

所有这些类的有效实例(例如regex=Regex,compOpt=CompOption,execOpt=ExecOption,和source=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
Run Code Online (Sandbox Code Playgroud)

所有这些类的有效实例(例如regex=Regex,source=String,target=Bool)意味着它可以用来匹配sourceregex以产生target.(其他有效target给出:S这些具体的regexsourceInt,MatchResult String,MatchArray,等)

一起把这些它是很明显,=~=~~仅仅是方便的功能

source1 =~ source
  = match (makeRegex source) source1
source1 =~~ source
  = matchM (makeRegex source) source1
Run Code Online (Sandbox Code Playgroud)

并且也是=~=~~不留余地通过各种选项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
Run Code Online (Sandbox Code Playgroud)

可以像

"string" =~+ ("regex", CompCaseless + compUTF8, execBlank) :: Bool
Run Code Online (Sandbox Code Playgroud)

或覆盖=~以及=~~可以接受选项的方法

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
Run Code Online (Sandbox Code Playgroud)

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


Jan*_*rts 9

我对Haskell一无所知,但是如果你使用的是基于PCRE的正则表达式库,那么你可以在正则表达式中使用模式修饰符.要以不区分大小写的方式匹配"无壳",可以在PCRE中使用此正则表达式:

(?i)caseless
Run Code Online (Sandbox Code Playgroud)

模式修饰符(?i)会覆盖在正则表达式之外设置的任何区分大小写或不区分大小写的选项.它也适用于不允许您设置任何选项的操作员.

类似地,(?s)打开"单线模式",这使点匹配线断开,(?m)打开"多线模式",这使得^和$匹配换行符,并且(?x)打开免费-spacing模式(非字符空格和字符类外的换行符是无关紧要的).你可以组合字母.(?ismx)打开一切.连字符会关闭选项.(?-i)使正则表达式区分大小写.(?xi)启动一个自由间隔区分大小写的正则表达式.


duk*_*ave 8

我相信如果你想使用compOpt以外的话,不能使用(=〜)defaultCompOpt.

像这样的工作:

match (makeRegexOpts compCaseless defaultExecOpt  "(Foo)" :: Regex) "foo" :: Bool
Run Code Online (Sandbox Code Playgroud)

以下两篇文章可以帮助您:

真实世界Haskell,第8章.高效的文件处理,正则表达式和文件名匹配

一个Haskell正则表达式教程