필터 지우기
필터 지우기

Problem using sscanf in picking out numbers from string.

조회 수: 30 (최근 30일)
Nicki
Nicki 2013년 12월 2일
댓글: Nicki 2023년 10월 28일
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.

채택된 답변

Laura Proctor
Laura Proctor 2013년 12월 2일
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
Stephen23
Stephen23 2023년 10월 28일
"...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.
Nicki
Nicki 2023년 10월 28일
Yes. I realize that now, thank you for clearing it up though.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Walter Roberson
Walter Roberson 2023년 10월 27일
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
Nicki
Nicki 2023년 10월 28일
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.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Large Files and Big Data에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by