Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/meooow25/parser-regex
Regex based parsers
https://github.com/meooow25/parser-regex
haskell parser-combinators regex
Last synced: 8 days ago
JSON representation
Regex based parsers
- Host: GitHub
- URL: https://github.com/meooow25/parser-regex
- Owner: meooow25
- License: bsd-3-clause
- Created: 2023-12-27T16:45:46.000Z (11 months ago)
- Default Branch: master
- Last Pushed: 2024-05-20T21:55:19.000Z (6 months ago)
- Last Synced: 2024-09-25T22:43:22.764Z (about 1 month ago)
- Topics: haskell, parser-combinators, regex
- Language: Haskell
- Homepage:
- Size: 331 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# parser-regex
[![Hackage](https://img.shields.io/hackage/v/parser-regex?logo=haskell&color=blue)](https://hackage.haskell.org/package/parser-regex)
[![Haskell-CI](https://github.com/meooow25/parser-regex/actions/workflows/haskell-ci.yml/badge.svg)](https://github.com/meooow25/parser-regex/actions/workflows/haskell-ci.yml)Regex based parsers
## Features
* Parsers based on [regular expressions](https://en.wikipedia.org/wiki/Regular_expression),
capable of parsing [regular languages](https://en.wikipedia.org/wiki/Regular_language).
There are no extra features that would make parsing non-regular languages
possible.
* Regexes are composed using combinators.
* Resumable parsing of sequences of any type containing values of any type.
* Special support for `Text` and `String` in the form of convenient combinators
and operations like find and replace.
* Parsing runtime is linear in the length of the sequence being parsed. No
exponential backtracking.## Example
```hs
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative (optional)
import Data.Text (Text)import Regex.Text (REText)
import qualified Regex.Text as R
import qualified Data.CharSet as CSdata URI = URI
{ scheme :: Maybe Text
, authority :: Maybe Text
, path :: Text
, query :: Maybe Text
, fragment :: Maybe Text
} deriving Show-- ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
-- A non-validating regex to extract parts of a URI, from RFC 3986
-- Translated:
uriRE :: REText URI
uriRE = URI
<$> optional (R.someTextOf (CS.not ":/?#") <* R.char ':')
<*> optional (R.text "//" *> R.manyTextOf (CS.not "/?#"))
<*> R.manyTextOf (CS.not "?#")
<*> optional (R.char '?' *> R.manyTextOf (CS.not "#"))
<*> optional (R.char '#' *> R.manyText)
```
```hs
>>> R.reParse uriRE "https://github.com/meooow25/parser-regex?tab=readme-ov-file#parser-regex"
Just (URI { scheme = Just "https"
, authority = Just "github.com"
, path = "/meooow25/parser-regex"
, query = Just "tab=readme-ov-file"
, fragment = Just "parser-regex" })
```## Documentation
Please find the documentation on Hackage:
[parser-regex](https://hackage.haskell.org/package/parser-regex)Already familiar with regex patterns? See the
[Regex pattern cheat sheet](https://github.com/meooow25/parser-regex/wiki/Regex-pattern-cheat-sheet).## Alternatives
### `regex-applicative`
[`regex-applicative`](https://hackage.haskell.org/package/regex-applicative) is
the primary inspiration for this library, and provides a similar set of
features.
`parser-regex` attempts to be a more fully-featured library built on the
ideas of `regex-applicative`.### Traditional regex libraries
Other alternatives are more traditional regex libraries that use regex patterns,
like [`regex-tdfa`](https://hackage.haskell.org/package/regex-tdfa) and
[`regex-pcre`](https://hackage.haskell.org/package/regex-pcre)/
[`regex-pcre-builtin`](https://hackage.haskell.org/package/regex-pcre-builtin).Reasons to use `parser-regex` over traditional regex libraries:
* You prefer parser combinators over regex patterns
* You need more powerful parsing capabilities than just submatch extraction
* You need to parse a sequence type that is not supported by these regex
librariesReasons to use traditional regex libraries over `parser-regex`:
* The terseness of regex patterns is better suited for your use case
* You need something very fast, and adversarial input is not a concern.
Use `regex-pcre`/`regex-pcre-builtin`.For a more detailed comparison of regex libraries, see
[here](https://github.com/meooow25/parser-regex/tree/master/bench).## Contributing
Questions, bug reports, documentation improvements, code contributions welcome!
Please [open an issue](https://github.com/meooow25/parser-regex/issues) as the
first step.