import Data.List (isPrefixOf, stripPrefix, genericLength, intercalate) trysplit :: String -> [String] -> Maybe (String, String) trysplit s delims = case filter (`isPrefixOf` s) delims of [] -> Nothing (d:_) -> Just (d, (\(Just x) -> x) $ stripPrefix d s) multisplit :: String -> [String] -> [(String, String, Int)] multisplit list delims = let ms [] acc pos = [(acc, [], pos)] ms l@(s:sx) acc pos = case trysplit l delims of Nothing -> ms sx (s : acc) (pos + 1) Just (d, sxx) -> (acc, d, pos) : ms sxx [] (pos + genericLength d) in ms list [] 0 main :: IO () main = do let parsed = multisplit "a!===b=!=c" ["==", "!=", "="] mapM_ putStrLn [ "split string:" , intercalate "," $ map (\(a, _, _) -> a) parsed , "with [(string, delimiter, offset)]:" , show parsed ]