Я не думаю, что регулярные выражения могут справиться с этим, если вы не знаете, сколько чисел / строк / других блоков у вас есть заранее. Например, в 'st34 *' есть 3 блока, поэтому это будет работать:
regexprep('st34*', '([A-Za-z]+|\d+|\W+)([A-Za-z]+|\d+|\W+)([A-Za-z]+|\d+|\W+)', ...
'$1 $2 $3')
Если вы не знаете количество кусков, вы можете привести к int и bucket в свои 3 категории, а затем посмотреть, где категория меняется, чтобы найти точку останова.
n = int32('st34a');
idx = zeros(size(n));
idx(ismember(n, int32('0'):int32('9'))) = 1;
idx(ismember(n, int32('a'):int32('z'))) = 2;
idx(ismember(n, int32('A'):int32('Z'))) = 2;
idx = diff(idx) ~= 0; % these are the breakpoints where your string changes type
Я не проверял это, но что-то вроде этого должно работать.