rex
A quasi-quoter for typeful results of regex captures.
LTS Haskell 23.1: | 0.6.2 |
Stackage Nightly 2024-12-22: | 0.6.2 |
Latest on Hackage: | 0.6.2 |
rex-0.6.2@sha256:5a05bb86240f911ef8d5a17c2df0e78728e57083b6d34b64e51abb747ba0e26c,1739
Module documentation for 0.6.2
- Text
- Text.Regex
- Text.Regex.PCRE
- Text.Regex
http://hackage.haskell.org/package/rex
Provides a quasi-quoter for regular expressions which yields a tuple, of appropriate arity and types, representing the results of the captures. Allows the user to specify parsers for captures as inline Haskell. Can also be used to provide typeful pattern matching in function definitions and case patterns.
To build / install:
./Setup.hs configure --user
./Setup.hs build
./Setup.hs install
See the haddock or Text/Regex/PCRE/Rex.hs
for documentation.
Some examples (verbatim from Test.hs):
math x = mathl x 0
mathl [] x = x
mathl [rex|^ \s*(?{ read -> y }\d+)\s*(?{ s }.*)$|] x = mathl s y
mathl [rex|^\+\s*(?{ read -> y }\d+)\s*(?{ s }.*)$|] x = mathl s $ x + y
mathl [rex|^ -\s*(?{ read -> y }\d+)\s*(?{ s }.*)$|] x = mathl s $ x - y
mathl [rex|^\*\s*(?{ read -> y }\d+)\s*(?{ s }.*)$|] x = mathl s $ x * y
mathl [rex|^ /\s*(?{ read -> y }\d+)\s*(?{ s }.*)$|] x = mathl s $ x / y
mathl str x = error str
-- math "1 + 3" == 4.0
-- math "3 * 2 + 100" == 106.0
-- math "20 / 3 + 100 * 2" == 213.33333333333334
peano :: String -> Maybe Int
peano = [rex|^(?{ length . filter (=='S') } \s* (?:S\s+)*Z)\s*$|]
-- peano "S Z" == Just 1
-- peano "S S S S Z" == Just 4
-- peano "S S Z" == Just 2
parsePair :: String -> Maybe (String, String)
parsePair = [rex|^<\s* (?{ }[^\s,>]+) \s*,\s* (?{ }[^\s,>]+) \s*>$|]
-- parsePair "<-1, 3>" == Just ("-1","3")
-- parsePair "<-4,3b0>" == Just ("-4","3b0")
-- parsePair "< a, -30 >" == Just ("a","-30")
-- parsePair "< a, other>" == Just ("a","other")
-- From http://www.regular-expressions.info/dates.html
parseDate :: String -> Maybe (Int, Int, Int)
parseDate [rex|^(?{ read -> y }(?:19|20)\d\d)[- /.]
(?{ read -> m }0[1-9]|1[012])[- /.]
(?{ read -> d }0[1-9]|[12][0-9]|3[01])$|]
| (d > 30 && (m `elem` [4, 6, 9, 11]))
|| (m == 2 &&
(d ==29 && not (mod y 4 == 0 && (mod y 100 /= 0 || mod y 400 == 0)))
|| (d > 29)) = Nothing
| otherwise = Just (y, m, d)
parseDate _ = Nothing
-- parseDate "1993.8.10" == Nothing
-- parseDate "1993.08.10" == Just (1993,8,10)
-- parseDate "2003.02.28" == Just (2003,2,28)
-- parseDate "2003.02.27" == Just (2003,2,27)
onNull a f [] = a
onNull _ f xs = f xs
nonNull = onNull Nothing
disjunct [rex| ^(?:(?{nonNull $ Just . head -> a} .)
| (?{nonNull $ Just . head -> b} ..)
| (?{nonNull $ Just . last -> c} ...))$|] =
head $ catMaybes [a, b, c]
-- disjunct "a" == 'a'
-- disjunct "ab" == 'a'
-- disjunct "abc" == 'c'
Changes
Changelog
0.6.2
- Now compiles with GHC-9.2. See [#14][]
0.6.1
- Now compiles with GHC-8.10. See #13
0.6
- Made the generated code total. See #10
0.5.1 (2014-02-20)
- Made the type of the default ‘rexView’ fully polymorphic.
0.5: (2014-02-20)
-
Changed the configuration datatype to allow custom preprocessing of expr / pat antiquotes. The default match processing is now “rexView”, an identifier that can be shadowed locally or hidden on import.
-
Removed ‘maybeRead’.
0.4.3: (2013-12-21)
-
Patch from aavogt! to use haskell-src-exts to parse view patterns.
-
Miscellaneous code cleanups.
0.4.2: (2013-02-04)
- Precompilation bugs fixed by takano-akio!
0.4: (2012-10-11)
- Made configuration into a datatype.
0.3: (2011-09-25)
-
Fixed a capture indexing bug, where capture fields which aren’t bound would cause subsequent bound captures to be incorrect.
-
Above bug fix actually neatened up code.
-
Added configuration of default mapping pattern.
0.2: (2011-09-24)
-
Added custom configuration of PCRE options.
-
Added non-precompiling quasiquoters.
-
Fixed a bug where patterns with no captures would fail.
-
Decided to remove the defaulting to ‘read’ - too much magic.
0.1: (2011-07-25)
- initial release