regex-applicative
regex-applicative is a parsing combinator library for Haskell based on regular
expressions.
Example
import Text.Regex.Applicative
data Protocol = HTTP | FTP deriving Show
protocol :: RE Char Protocol
protocol = HTTP <$ string "http" <|> FTP <$ string "ftp"
type Host = String
type Location = String
data URL = URL Protocol Host Location deriving Show
host :: RE Char Host
host = many $ psym $ (/= '/')
url :: RE Char URL
url = URL <$> protocol <* string "://" <*> host <* sym '/' <*> many anySym
main = print $ "http://stackoverflow.com/questions" =~ url
Documentation
See the API reference.
Performance
For common tasks, this package is several times slower than monadic
parser combinator libraries like parsec. However, this library has a roughly
linear complexity, whereas monadic parser combinators have exponential
worst-time complexity (see here).
Some tips to make your regex run faster:
-
If you don’t care about the result of the whole regex or its part, only
whether it matches or not, mark it with void
or <$
. Recognition is faster
than parsing.
-
If you apply the same regex to multiple strings, partially apply it like so:
let matcher = match my_regex
in map matcher my_strings
This way the compiled regex is stored in the matcher
value and shared among
the strings.
GHC support
Only GHC versions >= 8.0 are supported, although older versions may work too.