MATLAB Answers


Replacing strings with varying length and numbers

Asked by Daniel Schmidt on 24 Aug 2019 at 20:46
Latest activity Edited by Stephen Cobeldick on 26 Aug 2019 at 4:21
I want to replace strings in varying length an numeric values.
I know that the regexprep function is very powerfull in modifying strings, but all its syntax is very complex for me.
My strings are structured like this:
Now I want to be able to replace each number and its subsequent unit up to the unterscore symbol.
So I need something that replaces all numbers in front of for exmaple km, but the length of the numeric values in front of the units are not allways the same.
This should also include values for not whole numbers like '0.5ohm' which should also be replaced completele.
What is the right syntax to use for the regexprep function?


The numbers are rather simple.
Only whole numbers smaller than 500, so no exponents necessary.
Also only positive numbers, and neither minus nor plus signs.
For non whole numbers, they are allways wriiten as 0.x with 1 decimal digit.
And there are only non whole numbers smaller 1, so never decimal digits for number greater zero.
A zero is indicated by just 0.
It sounds like you just need to plug the values into the sprintf() command.
S = 'Phase1_525kV_4km_100m_0.5ohm';
newohm1 = '17';
newohm2 = '0.8';
newS1 = regexprep(S, '(0\.\d|\d+)(?=ohm)', newohm1, 'once')
newS2 = regexprep(newS1, '(0\.\d|\d+)(?=ohm)', newohm2, 'once')

Sign in to comment.

1 Answer

Answer by Stephen Cobeldick on 25 Aug 2019 at 8:10
 Accepted Answer

>> str = 'Phase1_525kV_4km_100m_0.5ohm';
>> out = regexprep(str,'\d+\.?\d*[a-zA-Z]+','X')
out = Phase1_X_X_X_X


Wow, very nice.
But what if I just want to replace one variable?
When I specifiy the unit 'm' that it replaces just the '100m'.
And if I choose 'ohm' that it replaces '0..5oohm'.
Is that possible.
"But what if I just want to replace one variable?"
You can specify the unit:
>> str = 'Phase1_525kV_4km_100m_0.5ohm';
>> regexprep(str,'\d+\.?\d*m','X') % replace meters
ans = Phase1_525kV_4km_X_0.5ohm
>> regexprep(str,'\d+\.?\d*ohm','X') % replace ohms
ans = Phase1_525kV_4km_100m_X
Note that for robustness this should be the complete suffix+unit, followed by a lookaround assertion that checks if the following character is '_' or the end of the string, other 'm' can be ambiguously interpreted.

Sign in to comment.