Since you are using C#, you may match a string with a pattern and access the capture collection of each repeated capturing group:
var s = "f20s30t"; var m = Regex.Match(s, @"^([fst])(\d+[fst])*$"); if (m.Success) { Console.WriteLine(m.Groups[1].Value); foreach (var g in m.Groups[2].Captures.Cast<Capture>().Select(t => t.Value)) Console.WriteLine(g); }
The advantage of this approach is that it also validates the string, and you won't get results for a string like TEXT random f20s30t here.....
See the C# demo, output
f 20s 30t
Here is the regex demo:

Details
^ - start of the string ([fst]) - Capturing group 1: f, s or t (\d+[fst])* - 0 or more repetitions (captured into Group 2 with each value saved in the group stack) of: \d+ - 1+ digits [fst] - f, s or t
$ - end of string.
\d*[fst]. In .NET, you may grab all the captures by accessing the capture collection related to a certain group. Is it a whole string or part of a longer text?