import "Prelude" hiding (group) importJava "java.util.regex.Pattern" where data Pattern compile :: String -> Pattern matcher :: Pattern -> String -> Matcher importJava "java.util.regex.Matcher" where data Matcher matches :: Matcher -> Boolean group :: Matcher -> String @JavaName find matcherFind :: Matcher -> Boolean appendReplacement :: Matcher -> StringBuffer -> String -> Matcher appendTail :: Matcher -> StringBuffer -> StringBuffer @JavaName replaceAll replaceAll_ :: Matcher -> String -> String @JavaName replaceFirst replaceFirst_ :: Matcher -> String -> String quoteReplacement :: String -> String importJava "java.lang.StringBuffer" where data StringBuffer @JavaName "" newStringBuffer :: () -> StringBuffer @JavaName toString freezeStringBuffer :: StringBuffer -> String """ @replaceAll pattern replacement text@ replaces all matches of @pattern@ in the @text@ by @replacement@. """ replaceAll :: String -> String -> String -> String replaceAll pattern replacement text = replaceAll_ (matcher (compile pattern) text) replacement """ @replaceFirst pattern replacement text@ replaces the first match of @pattern@ in the @text@ by @replacement@. """ replaceFirst :: String -> String -> String -> String replaceFirst pattern replacement text = replaceFirst_ (matcher (compile pattern) text) replacement """ @substituteAll pattern f text@ replaces all matches of @pattern@ in the @text@ by the string returned by @f@ given the matched region of the string as a parameter. """ substituteAll :: String -> (String -> String) -> String -> String substituteAll pattern f text = runProc do m = matcher (compile pattern) text buf = newStringBuffer () while (matcherFind m) do appendReplacement m buf $ f $ group m appendTail m buf freezeStringBuffer buf """ @substituteFirst pattern f text@ replaces the first match of @pattern@ in the @text@ by the string returned by @f@ given the matched region of the string as a parameter. """ substituteFirst :: String -> (String -> String) -> String -> String substituteFirst pattern f text = runProc do m = matcher (compile pattern) text if (matcherFind m) then do buf = newStringBuffer () appendReplacement m buf $ f $ group m appendTail m buf freezeStringBuffer buf else text