Extracting numbers from mixed string
이전 댓글 표시
I have filenames saved as strings such as '2001_06m'. Sometimes the files are inconsistently named as '2001_6m' (missing the zero before the 6) or '2001_06' (missing the m at the end). What code would I use to extract the non-zero integers after underscore in all cases (i.e. output = 6)?
And separately, what code would I use to extract the numbers before the underscore (usually they are 4 digits long, but sometimes 3 digits, i.e. '001' instead of '2001')?
채택된 답변
추가 답변 (3개)
A possible regexp version would be:
str2double(regexp(filename, '(\d+)_(\d+)', 'tokens', 'once'))
edit: following the discussion in Jan's answer, a vectorised version for when filenames is a cell array of char arrays or a string array:
tokens = regexp(filenames, '(\d+)_(\d+)', 'tokens', 'once');
str2double(vertcat(tokens{:}))
Note that the vertcat call will fail if a filename does not match the pattern.
Fully vectorized, one line, and more efficient than regexp and/or str2double:
>> C = {'2001_06m','2001_7m','2001_08'};
>> sscanf(sprintf('%sm',C{:}),'%*d_%d%*[m]') % second number
ans =
6
7
8
>> sscanf(sprintf('%sm',C{:}),'%d_%*d%*[m]') % first number
ans =
2001
2001
2001
>> sscanf(sprintf('%sm',C{:}),'%d_%d%*[m]') % both numbers
ans =
2001
6
2001
7
2001
8
"...usually they are 4 digits long, but sometimes 3 digits, i.e. '001' instead of '2001'"
My answer works regardless of the number of digits in the numbers.
dpb
2018년 10월 7일
v=str2double(strip(splitstr(s,'_'),'m')); % chuckles...
In reality, write a regexp expression is the more general solution but I have to spend too much time figuring out the syntax and am too impatient... :)
카테고리
도움말 센터 및 File Exchange에서 Characters and Strings에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!