;lib: regex utilities: cleanup (#1312)
This commit is contained in:
parent
a112085092
commit
4957008890
@ -153,9 +153,12 @@ replaceRegex re repl s = foldl (replaceMatch repl) s (reverse $ match re s :: [M
|
||||
--------------------------------------------------------------------------------
|
||||
-- new total functions
|
||||
|
||||
-- | Does this regexp match the given string ?
|
||||
-- Or return an error if the regexp is malformed.
|
||||
regexMatches_ :: Regexp -> String -> Either Error Bool
|
||||
regexMatches_ r s = (`match` s) <$> toRegex_ r
|
||||
|
||||
-- | Like regexMatches_ but match case-insensitively.
|
||||
regexMatchesCI_ :: Regexp -> String -> Either Error Bool
|
||||
regexMatchesCI_ r s = (`match` s) <$> toRegexCI_ r
|
||||
|
||||
@ -165,6 +168,7 @@ regexMatchesCI_ r s = (`match` s) <$> toRegexCI_ r
|
||||
regexReplace_ :: Regexp -> Replacement -> String -> Either Error String
|
||||
regexReplace_ re repl s = toRegex_ re >>= \rx -> replaceRegex_ rx repl s
|
||||
|
||||
-- | Like regexReplace_ but match occurrences case-insensitively.
|
||||
regexReplaceCI_ :: Regexp -> Replacement -> String -> Either Error String
|
||||
regexReplaceCI_ re repl s = toRegexCI_ re >>= \rx -> replaceRegex_ rx repl s
|
||||
|
||||
@ -173,6 +177,7 @@ regexReplaceCI_ re repl s = toRegexCI_ re >>= \rx -> replaceRegex_ rx repl s
|
||||
regexReplaceMemo_ :: Regexp -> Replacement -> String -> Either Error String
|
||||
regexReplaceMemo_ re repl = memo (regexReplace_ re repl)
|
||||
|
||||
-- | Like regexReplaceMemo_ but match occurrences case-insensitively.
|
||||
regexReplaceCIMemo_ :: Regexp -> Replacement -> String -> Either Error String
|
||||
regexReplaceCIMemo_ re repl = memo (regexReplaceCI_ re repl)
|
||||
|
||||
@ -181,26 +186,29 @@ regexReplaceCIMemo_ re repl = memo (regexReplaceCI_ re repl)
|
||||
regexReplaceBy_ :: Regexp -> (String -> String) -> String -> Either Error String
|
||||
regexReplaceBy_ r f s = toRegex_ r >>= \rx -> Right $ replaceAllBy rx f s
|
||||
|
||||
-- | Like regexReplaceBy_ but match occurrences case-insensitively.
|
||||
regexReplaceByCI_ :: Regexp -> (String -> String) -> String -> Either Error String
|
||||
regexReplaceByCI_ r f s = toRegexCI_ r >>= \rx -> Right $ replaceAllBy rx f s
|
||||
|
||||
-- helpers:
|
||||
|
||||
-- | Convert our string-based Regexp to a real Regex, or return a parse error.
|
||||
-- Convert a Regexp string to a compiled Regex, or return an error message.
|
||||
toRegex_ :: Regexp -> Either Error Regex
|
||||
toRegex_ = memo (compileRegex_ defaultCompOpt defaultExecOpt)
|
||||
|
||||
-- | Convert our string-based Regexp to a case-insensitive real Regex,
|
||||
-- or return a parse error.
|
||||
-- Like toRegex, but make a case-insensitive Regex.
|
||||
toRegexCI_ :: Regexp -> Either Error Regex
|
||||
toRegexCI_ = memo (compileRegex_ defaultCompOpt{caseSensitive=False} defaultExecOpt)
|
||||
|
||||
-- Compile a Regexp string to a Regex with the given options, or return an
|
||||
-- error message if this fails.
|
||||
compileRegex_ :: CompOption -> ExecOption -> Regexp -> Either Error Regex
|
||||
compileRegex_ compopt execopt r =
|
||||
maybe (Left $ "this regular expression could not be compiled: " ++ show r) Right $
|
||||
makeRegexOptsM compopt execopt r
|
||||
|
||||
-- Replace this regular expression with this replacement pattern in this string, or return an error message.
|
||||
-- Replace this regular expression with this replacement pattern in this
|
||||
-- string, or return an error message.
|
||||
replaceRegex_ :: Regex -> Replacement -> String -> Either Error String
|
||||
replaceRegex_ re repl s = foldM (replaceMatch_ repl) s (reverse $ match re s :: [MatchText String])
|
||||
where
|
||||
@ -228,10 +236,10 @@ replaceRegex_ re repl s = foldM (replaceMatch_ repl) s (reverse $ match re s ::
|
||||
|
||||
-- helpers
|
||||
|
||||
-- Adapted from http://stackoverflow.com/questions/9071682/replacement-substition-with-haskell-regex-libraries:
|
||||
-- adapted from http://stackoverflow.com/questions/9071682/replacement-substition-with-haskell-regex-libraries:
|
||||
|
||||
-- | Replace all occurrences of a regexp in a string, transforming each match
|
||||
-- with the given function.
|
||||
-- Replace all occurrences of a regexp in a string, transforming each match
|
||||
-- with the given pure function.
|
||||
replaceAllBy :: Regex -> (String -> String) -> String -> String
|
||||
replaceAllBy re transform s = prependdone rest
|
||||
where
|
||||
@ -244,10 +252,10 @@ replaceAllBy re transform s = prependdone rest
|
||||
(matched, rest) = splitAt len matchandrest
|
||||
in (off + len, rest, prepend . (prematch++) . (transform matched ++))
|
||||
|
||||
-- | Replace all occurrences of a regexp in a string, transforming each match
|
||||
-- with the given monadic transform function. Eg if the monad is Either, a
|
||||
-- Left result from the transform function short-circuits and is returned as
|
||||
-- the overall result.
|
||||
-- Replace all occurrences of a regexp in a string, transforming each match
|
||||
-- with the given monadic function. Eg if the monad is Either, a Left result
|
||||
-- from the transform function short-circuits and is returned as the overall
|
||||
-- result.
|
||||
replaceAllByM :: forall m. Monad m => Regex -> (String -> m String) -> String -> m String
|
||||
replaceAllByM re transform s =
|
||||
foldM go (0, s, id) matches >>= \(_, rest, prependdone) -> pure $ prependdone rest
|
||||
|
||||
Loading…
Reference in New Issue
Block a user