I want to split a string according to a predefined set of substrings (lowercase), though the actual text can contain uppercase characters anyplace. The task is to find the matches, longer preferred over shorter (like "tt" over "t" hence the order of alt ) and to maintain upper/lowercase status. Since StringCases has a quirk not being able to correctly recognize some upper/lowercase characters (cf. here ), the solution is not trivial. The following code matches every element in alt correctly, though it also converts everything to lowercase: alt = "tt" | "t" | "a" | "á"; word = "TtattÁatT"; StringCases[ToLowerCase@word, alt] {"tt", "a", "tt", "á", "a", "tt"} The next one, while correctly maintains capital letters, fails to recognize "Á" as the uppercase version of "á" (or of a , see later). StringCases[word, alt, IgnoreCase -> Tru