1

我有一个使用 Text.Regex.PCRE 的正则表达式,效果很好:

[[_,_id,_name]] = "199mercury" =~ "(\\d+)(\\w+) :: [[String]]

但是,我在 {-# LANGUAGE OverloadedStrings #-} 中添加了使用 aeson(json 库)并在 =~ 上得到一个实例错误:

<interactive>:33:14:
    No instances for (RegexMaker Regex CompOption ExecOption source0,
                      RegexContext Regex source10 target0)
      arising from a use of `=~'
    Possible fix:
      add instance declarations for
      (RegexMaker Regex CompOption ExecOption source0,
       RegexContext Regex source10 target0)
    In the expression: "199mercury" =~ "(\\d+(\\w+)"
    In an equation for `it': it = "199mercury" =~ "(\\d+(\\w+)"

搜索修复似乎是将正则表达式更改为:

getAllTextSubmatches ("199mercury" =~ "(\\d+(\\w+)" :: AllTextSubmatches [] String)

但这似乎只是给了我另一个实例错误:

   No instances for (RegexMaker Regex CompOption ExecOption source0,
                      RegexContext Regex source10 (AllTextSubmatches [] String))

放在这里的正确类型是什么?我尝试的任何方法似乎都不起作用。似乎 OverloadedStrings 是问题所在,但除了仅将 Data.Text.pack 与 aeson 一起使用之外,我找不到任何解决方案,但我想弄清楚我在使用正则表达式时做错了什么。我很好奇 Text.Regex 不能与 OverloadedStrings 一起使用是否存在问题,但我找不到任何证据。

4

1 回答 1

9

它不漂亮,但这种类型检查:

{-# LANGUAGE OverloadedStrings #-}    
import Text.Regex.PCRE

quux = ("1999mercury" :: String) =~ ("(\\d+)(\\w+)" :: String) :: [[String]]

您还可以创建一个单态版本=~以避免一直编写类型:

matches :: String -> String -> [[String]]
matches = (=~)

quux = "1999mercury" `matches` "(\\d+)(\\w+)"
于 2013-04-04T03:45:16.153 回答