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 が問題のようですが、aeson で Data.Text.pack を使用する以外に解決策が見つかりません。これは機能しますが、正規表現で何が間違っているのかを理解したいと思います。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 に答える