match :: String -> String -> Bool match ('^':rest) text = matchLocal rest text match rex (c:rest) = matchLocal rex (c:rest) || match rex rest match _ _ = False matchLocal :: String -> String -> Bool matchLocal [] _ = True matchLocal "$" [] = True matchLocal (c:'*':restR) (t:restT) = c == t && matchLocal restR (starSkip c (t:restT)) matchLocal (r:restR) (t:restT) = (r == '.' || r == t) && matchLocal restR restT matchLocal _ _ = False starSkip :: Char -> String -> String starSkip c (t:rest) = if c == t then starSkip c rest else t:rest starSkip _ [] = []