GitXplorerGitXplorer
U

regex-applicative

public
130 stars
12 forks
13 issues

Commits

List of commits on branch master.
Unverified
a39cd4fabadc1d028e197606fb41b7870d6552d0

Move doctest to its own test suite

UUnkindPartition committed 3 years ago
Unverified
1b585e190115bc889b9d931ce510e3ee24aaec70

Update the stackage snapshot

UUnkindPartition committed 3 years ago
Unverified
3716de88024d0cb6d312b4bac922120fa31dbc02

test: Check documentation tests

jjtojnar committed 3 years ago
Unverified
d964042db76d1212854e94b756382f252a3ff33c

Change the github username

UUnkindPartition committed 4 years ago
Unverified
449519c38e65753345e9a008362c011cb7a0a4d9

Release regex-applicative-0.3.4

UUnkindPartition committed 4 years ago
Unverified
1006a5a133f5e6a642469408602acd38921da546

Do not re-export Data.Filtrable

UUnkindPartition committed 4 years ago

README

The README file for this repository.

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:

  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.