Help with extracting part of a string
38 ビュー (過去 30 日間)
古いコメントを表示
I have the string "2DVIS_data_08_40fs", and I want to extract the numbers included between the last underscore '_' and the last two letters 'fs', in this case 40. Given the string "2DVIS_data_08_120fs", I want as output 120 and so on. How can I do this? thanks
0 件のコメント
採用された回答
Chad Greene
2014 年 9 月 26 日
Guillame's answer is best, and it's probably good to learn how to use the power of regexp. But if you want a more intuitive-for-beginners approach, find the indices of the underscores, find the indices of fs, and then return everything between them:
somestring = '2DVIS_data_08_40fs';
underscore_indices = strfind(somestring,'_');
fs_indices = strfind(somestring,'fs');
yourNumber = str2double(somestring(underscore_indices(end)+1:fs_indices(end)-1))
その他の回答 (3 件)
Stephen23
2014 年 9 月 26 日
編集済み: Stephen23
2014 年 9 月 27 日
Given a literal interpretation of your statement "extract the numbers included between the last underscore '_' and the last two letters 'fs'", this could be done using the following regexp match string:
>>A = {'2DVIS_data_08_120fs','2DVIS_data_08_40fs'};
>>B = regexp(A,'(?<=_)\d+(?=fs$)','once','match')
B =
'120' '40'
This match string locates one or more digits located between an '_' and the last two characters of the string (which must be 'fs'). If the strings are always of the same format, then matching of the last two characters would be enough.
Guillaume
2014 年 9 月 26 日
Use regexp, you haven't explained the pattern in great details, the following may be what you want:
elems = regexp(s, '_(\d+)_[^_]*(..)$', 'tokens', 'once');
number = str2double(elems{1});
string = elems{2};
It will match any pattern with _, followed by 1 or more digit (an integer), followed by _, followed by any 0 or more characters not including _, followed by two characters at the end of the string. It extracts the integer and the last two characters.
2 件のコメント
Guillaume
2014 年 9 月 27 日
Realised I misunderstood the pattern. Stephen's or the following would work:
number = str2double(regexp(s, '_(\d+)..$', 'tokens', 'once'));
If you want to ensure that the last two characters are letters:
number = str2double(regexp(s, '_(\d+)[a-zA-Z]{2}', 'tokens', 'once'));
Or if it's always 'fs':
number = str2double(regexp(s, '_(\d+)fs', 'tokens', 'once'));
Albert Passy
2018 年 11 月 14 日
"Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems."
Regexes are expressive, compact and cryptic. reserve them for complex problems.
1 件のコメント
参考
カテゴリ
Help Center および File Exchange で Characters and Strings についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!