Problem using sscanf in picking out numbers from string.

So, I have the string:
str1=D993920x2ExlsSuited20.xls
And I want to pick out the numbers in the string, to give me a vector like
res=[993920 2 20]
Allowing me to pick up the last number for use in naming a txt document.
However, I cannot get sscanf to give me this.
I tried using.
res = sscanf(str1, ['%d'])
Shouldn't this give me the numbers in the string at least? All I get is a space sign...
All help on this would be greatly appreciated.
Best regards, Nicki Eriksen.

 Accepted Answer

The following code should give you results close to what you want:
res = sscanf(str1,'%*[^0123456789]%d')
The idea is that sscanf will try to match all the strings specified, and if it doesn't find a match, then it returns what is found. So, when you use '%d', since the first character in the string is a letter and not a number, it doesn't find a match, and returns nothing.
In the code above, the first element is looking for anything that doesn't match the numbers 0-9. The carat in the beginning indicates a non-match. The asterisk indicates that you don't want to save that information in the output. So, it looks for non-numbers then numbers alternating until the end of the string and only saves the numbers. The documentation for textscan explains it better.

3 Comments

Yes, thank you, that helped me. I would suggest more, or maybe more diverse, examples in the documentation. I will look in to the documentation for textscan. Thank you for your help.
One (two actually) final question(s), to make sure I got it right,
%[ ] The symbols in these mark what I am looking for, the carat, *, inverts this, so that I am looking for everything not in here.
Why is the ^ there?
"...the carat, *, inverts this, so that I am looking for everything not in here. Why is the ^ there?"
You have mixed up the names of the symbols. The caret ^ is used to invert the match inside the square brackets. The asterisk * excludes that data from the output.
Yes. I realize that now, thank you for clearing it up though.

Sign in to comment.

More Answers (1)

str1 = 'D993920x2ExlsSuited20.xls';
%method 1
res = str2double(regexp(str1, '\d+', 'match'))
res = 1×3
993920 2 20
%method 2
res = double(extract(string(str1), digitsPattern))
res = 3×1
993920 2 20

1 Comment

Hi. Thanks for the solution. My question is 10 years old, but his was the exact solution I was looking for. Can't remember what I ended up using though.

Sign in to comment.

Categories

Tags

Asked:

on 2 Dec 2013

Commented:

on 28 Oct 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!