mkRegex,
mkRegexWithOpts,
matchRegex,
- matchRegexAll
+ matchRegexAll,
+ subRegex,
+ splitRegex
) where
import Prelude
-- > subexpression matches )
matchRegexAll p str = unsafePerformIO (RE.regexec p str)
+
+{- | Replaces every occurance of the given regexp with the replacement string.
+
+In the replacement string, @\"\\1\"@ refers to the first substring;
+@\"\\2\"@ to the second, etc; and @\"\\0\"@ to the entire match.
+@\"\\\\\\\\\"@ will insert a literal backslash.
+
+-}
+subRegex :: Regex -- ^ Search pattern
+ -> String -- ^ Input string
+ -> String -- ^ Replacement text
+ -> String -- ^ Output string
+subRegex _ "" _ = ""
+subRegex regexp inp repl =
+ let bre = mkRegex "\\\\(\\\\||[0-9]+)"
+ lookup _ [] _ = []
+ lookup [] _ _ = []
+ lookup match repl groups =
+ case matchRegexAll bre repl of
+ Nothing -> repl
+ Just (lead, _, trail, bgroups) ->
+ let newval = if (head bgroups) == "\\"
+ then "\\"
+ else let index = (read (head bgroups)) - 1
+ in
+ if index == -1
+ then match
+ else groups !! index
+ in
+ lead ++ newval ++ lookup match trail groups
+ in
+ case matchRegexAll regexp inp of
+ Nothing -> inp
+ Just (lead, match, trail, groups) ->
+ lead ++ lookup match repl groups ++ (subRegex regexp trail repl)
+
+{- | Splits a string based on a regular expression. The regular expression
+should identify one delimiter.
+-}
+
+splitRegex :: Regex -> String -> [String]
+splitRegex _ [] = []
+splitRegex delim str =
+ case matchRegexAll delim str of
+ Nothing -> [str]
+ Just (firstline, _, remainder, _) ->
+ if remainder == ""
+ then firstline : [] : []
+ else firstline : splitRegex delim remainder