Haskellで正規表現を扱う

Text.Regex.Posixパッケージを使ってみる。

hackage.haskell.org

環境

Haskell Stackを利用。

$ stack --version
Version 2.1.3 x86_64

インストール

stack installコマンドでインストールする。

$ stack install regex-posix

インストールできたら、ghciを起動してインポートすれば準備完了。

$ stack ghci
Prelude> import Text.Regex.Posix

使い方

=~演算子を使う。末尾に型をつけないとエラーになるので注意が必要。

Prelude import Text.Regex.Posix> "foo bar baz" =~ "foo" :: Bool
True
Prelude import Text.Regex.Posix> "foo bar baz" =~ "hoge" :: Bool
False
Prelude import Text.Regex.Posix> "foo bar baz" =~ "hoge"
<interactive>:4:1: error:
    • Non type-variable argument
        in the constraint: RegexContext Regex [Char] target
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall target. RegexContext Regex [Char] target => target

指定する型を変えると、いろいろな返り値を得ることができる。

Prelude Text.Regex.Posix> "foo bar baz" =~ "ba." :: Bool
True -- マッチしたかどうか
Prelude Text.Regex.Posix> "foo bar baz" =~ "ba." :: Int
2 -- マッチした回数
Prelude Text.Regex.Posix> "foo bar baz" =~ "ba." :: String
"bar" -- 最初にマッチしたもの
Prelude Text.Regex.Posix> "foo bar baz" =~ "ba." :: [[String]]
[["bar"],["baz"]] -- マッチしたもの全て

他にも色々ありそうだが、基本的な操作は上記のもので事足りそう。

Prelude Text.Regex.Posix> "foo bar baz" =~ "ba." :: (Int, Int)
(4,3) -- (マッチした位置, マッチした長さ)
Prelude Text.Regex.Posix> "foo bar baz" =~ "ba." :: (String, String, String)
("foo ","bar"," baz") -- (マッチした部分より前, マッチした部分, マッチした部分より後)