ghci> getAllTextMatches ("foo" =~ "o" :: AllTextMatches [] String)
["o", "o"]
I haven't used regexes in Haskell much (which is I think Dan Burton's answer is more idiomatic).
So the way I figured this out is I looked at your type error No instance for (RegexContext Regex [Char] [String])
, and popped into ghci:
ghci> :t (=~)
(=~)
:: (RegexMaker Regex CompOption ExecOption source,
RegexContext Regex source1 target) =>
source1 -> source -> target
So RegexContext Regex [Char] [String]
is a class that includes the return type of "foo" =~ "o" :: [String]
. So I looked to see what instances of this class did exist, so I could find out what the return value was allowed to be:
ghci> :i RegexContext
class RegexLike
regex source => RegexContext regex source target where
match :: regex -> source -> target
matchM :: Monad m => regex -> source -> m target
-- Defined in Text.Regex.Base.RegexLike
instance RegexContext Regex String String
-- Defined in Text.Regex.Posix.String
instance RegexLike a b => RegexContext a b [[b]]
-- Defined in Text.Regex.Base.Context
...
instance RegexLike a b => RegexContext a b (AllTextMatches [] b)
-- Defined in Text.Regex.Base.Context
...
The AllTextMatches
name seemed to indicate what you were looking for, so I checked that out:
ghci> :i AllTextMatches
newtype AllTextMatches f b
= AllTextMatches {getAllTextMatches :: f b}
-- Defined in Text.Regex.Base.RegexLike
instance RegexLike a b => RegexContext a b (AllTextMatches [] b)
-- Defined in Text.Regex.Base.Context
So this was the type to use to extract all the text matches, as I suspected. All I needed to do was indicate that I wanted a return value of that type.
Note also the possible return type of [[b]]
, which I assume returns a list of lists containing each complete match and all its submatches:
ghci> "foo" =~ "o" :: [[String]]
[["o"],["o"]]
ghci> "foo bar baz" =~ "[aeiou](.)" :: [[String]]
[["oo","o"],["ar","r"],["az","z"]]
So maybe that's the type you meant to use, instead of [String]
. I could see [String]
as being slightly ambiguous when [[String]]
existed - should "foo bar baz" =~ "[aeiou](.)" :: [String]
be fst ("foo bar baz" =~ "[aeiou](.)" :: [[String]])
or map fst ("foo bar baz" =~ "[aeiou](.)" :: [[String]])
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…