regex-applicative: Regex-based parsing with applicative interface

[ library, mit, text ] [ Propose Tags ]

regex-applicative is a Haskell library for parsing using regular expressions. Parsers can be built using Applicative interface.

[Skip to Readme]
Versions [faq] 0.1, 0.1.1, 0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.2, 0.2.1, 0.3,,,, 0.3.1, 0.3.2,, 0.3.3,, 0.3.4
Change log
Dependencies base (<5), containers, filtrable (>=0.1.3), transformers [details]
License MIT
Author Roman Cheplyaka
Maintainer Roman Cheplyaka <>
Category Text
Home page
Source repo head: git clone git://
Uploaded by RomanCheplyaka at 2020-07-24T09:45:48Z
Distributions Arch:0.3.4, Debian:0.3.3, Fedora:, FreeBSD:, LTSHaskell:0.3.3, NixOS:0.3.4, Stackage:0.3.3, openSUSE:0.3.4
Downloads 21622 total (275 in the last 30 days)
Rating 2.5 (votes: 3) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2020-07-24 [all 1 reports]


[Index] [Quick Jump]


Maintainer's Corner

For package maintainers and hackage trustees

Readme for regex-applicative-0.3.4

[back to package description]


regex-applicative is a parsing combinator library for Haskell based on regular expressions.


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 $ "" =~ url


See the API reference.


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:

  1. 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.

  2. 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.