MATLAB: Modify Strings in cell array according to pattern

cell array string patternchange string patternmodify stringssort string by pattern

I have to cell arrays A & B
A = ['C1 H2 O1 N1 S1';
[];
'C5 H2 O0 N1 S0';
'C2 H6 O0 N1 S1';
'C2 H6 O2 N1 S0';
[];
'C3 H10 O1 N1 S0';
'C6 H5 O2 N2 S1';
'C8 H9 O4 N0 S0';
[];
'C9 H13 O3 N0 S0';
'C10 H17 O2 N0 S0';
'C11 H21 O1 N0 S0';
'C12 H25 O0 N0 S0'];
and
B = ['C5H9O2+'
'C3H5O4'
'C3H7O5']
and I would like to have B in the same pattern as A so that (C* H* O* N* S*)
and deleting the +
B[1] = 'C5 H9 O2 NO S0'
kinda tried with regexprep() but didn't get anything by now…..

Best Answer

Let me know how this works for you.
B = {'C3H7O';'C2H7O2';'C2H7O2+';'C4H5O';'C4H5O';'C3H3O2';'';'C4H7O';'C3H5O2';'C3H7O2';'C2H5O3';...
'C2H5O3';'C2H7O3';'';'';'C4H5O2';'C4H5O2';'C4H5O2';'C4H7O2'};
I = {'C0','H0','O0','N0','S0'};
B = regexprep(B,{'\W','(?![CHONS]\d+)[CHONS]'},''); % Removes all but letter/number pairs
B(cellfun(@isempty,B)) = join(I,''); % Replaces empty cells with I
% Adds missing letter/number pairs to each cell of B and joins with no spacing
expr = {'(C\d+)','(H\d+)','(O\d+)','(N\d+)','(S\d+)'};
for i=1:size(B,1)
B(i) = join([B{i},I(cellfun(@isempty,regexp(B{i},expr)))],'');
end
% Adds a single space between letter/number pairs
B = regexprep(B,'(C\d+)(H\d+)(O\d+)(N\d+)(S\d+)','$1 $2 $3 $4 $5');