pcre2: Regular expressions via the PCRE2 C library (included)

[ apache, library, text ] [ Propose Tags ]

Please see the README on GitHub at https://github.com/sjshuck/hs-pcre2

[Skip to Readme]
Versions [faq] 1.0.0, 1.0.1,, 1.0.2, 1.1.0, 1.1.1, 1.1.2, 1.1.3,, 1.1.4
Change log ChangeLog.md
Dependencies base (>=4.9 && <5), containers, mtl, template-haskell, text [details]
License Apache-2.0
Copyright 2020 Shlomo Shuck
Author Shlomo Shuck and contributors
Maintainer stevenjshuck@gmail.com
Category Text
Home page https://github.com/sjshuck/hs-pcre2#readme
Bug tracker https://github.com/sjshuck/hs-pcre2/issues
Source repo head: git clone https://github.com/sjshuck/hs-pcre2
Uploaded by SShuck at 2021-01-09T22:55:53Z
Distributions NixOS:1.1.4
Downloads 295 total (47 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2021-01-09 [all 1 reports]


[Index] [Quick Jump]


Maintainer's Corner

For package maintainers and hackage trustees

Readme for pcre2-1.1.4

[back to package description]


CI Hackage

Regular expressions for Haskell.


embeddedLicensePlate :: Text -> Maybe Text
embeddedLicensePlate = match "[A-Z]{3}[0-9]{3,4}"
case "The quick brown fox" of
    [regex|brown\s+(?<animal>\S+)|] -> Text.putStrLn animal
    _                               -> error "nothing brown"
let kv'd = lined . packed . [_regex|^\s*(.*?)\s*[=:]\s*(.*)|]

forMOf kv'd file $ execStateT $ do
    k <- gets $ capture @1
    v <- gets $ capture @2
    liftIO $ Text.putStrLn $ "found " <> k <> " set to " <> v

    case myMap ^. at k of
        Just v' | v /= v' -> do
            liftIO $ Text.putStrLn $ "setting " <> k <> " to " <> v'
            _capture @2 .= v'
        _ -> liftIO $ Text.putStrLn "no change"


  • Low-surface API covering most use cases.
  • Quiet functions with simple types—for the most part it's
    Text (pattern) -> Text (subject) -> result.
  • Use partial application to create performant, compile-once-match-many code.
  • Low cognitive overhead—there's just one custom datatype for both compile and match options, the Option monoid.
  • Text everywhere for interop with both C and the broader Haskell ecosystem.
  • Match failures expressed via Alternative or pattern match failures.
  • Opt-in Template Haskell facilities for compile-time verification of patterns, indexing captures, and memoizing inline regexes.
  • Opt-in lens support.
  • No failure monads to express compile errors, preferring pure functions and throwing imprecise exceptions with pretty Show instances. Write simple code and debug it. Or, don't, and use the Template Haskell features instead. Both are first-class.
  • Vast presentation of PCRE2 functionality. We can even register Haskell callbacks to run during matching!
  • Few dependencies.
  • Bundled, statically-linked UTF-16 build of up-to-date PCRE2 (version 10.36), with a complete, exposed Haskell binding.


  • Many performance optimizations. Currently we are as much as 2–3× slower than other libraries for some operations, although things are improving. (We are already faster than regex-base/regex-pcre when working with Text.) If it's really regex processing that's causing a bottleneck, pcre-light/-heavy/lens-regex-pcre are recommended instead of this library for the very best performance.
  • Make use of DFA and JIT compilation.
  • Improve PCRE2 C compile time.
  • Add splitting support.


Apache 2.0.
PCRE2 is distributed under the 3-clause BSD license.

Main Author

©2020 Shlomo Shuck