[project @ 2004-12-09 09:45:39 by simonmar]
authorsimonmar <unknown>
Thu, 9 Dec 2004 09:45:39 +0000 (09:45 +0000)
committersimonmar <unknown>
Thu, 9 Dec 2004 09:45:39 +0000 (09:45 +0000)
Add subRegex & splitRegex

Contributed by: John Goerzen <jgoerzen@complete.org>

Text/Regex.hs

index b440070..7a24043 100644 (file)
@@ -18,7 +18,9 @@ module Text.Regex (
     mkRegex,
     mkRegexWithOpts,
     matchRegex,
-    matchRegexAll
+    matchRegexAll,
+    subRegex,
+    splitRegex
   ) where
 
 import Prelude
@@ -78,3 +80,52 @@ matchRegexAll
                -- >         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