我很难从几个字符串中获取数字:
'L/22P/93'
'P/8P/48L/3'
'1L/63P/751' (this one is: 1, 63, 75, 1)
'PL/18'
'P/30P/5'
'PP'
我想得到所有数字,所以我可以用它们进行计算。
我尝试过使用regexp,但我只能得到每个字符串的第一个数字。
答案 0 :(得分:1)
一种简单的方法是用空格替换所有其他字符,然后读取字符串:
function nums = read_numbers(str)
%// This works only for integer numbers without sign
not_digit = (str < '0') | (str > '9');
str(not_digit) = ' ';
nums = sscanf(str, '%u');
end
正如评论所说,该功能并未考虑科学记数法中的符号(+/-),小数点或实数。
在文件read_numbers.m
中保存上述代码后,您可以像以下示例一样使用它:
>> read_numbers('L/22P/93');
22
93
答案 1 :(得分:1)
虽然正则表达式可能令人生畏,但MATLAB的regex
文档相当全面,应该足以帮助解决这个问题。
正如其他人所评论的,这里有几个问题需要回答,以便为您的问题提供全面的答案:
与此同时,这应该返回您使用regex
请求的内容,但它假设您的数字是无符号整数,并且您希望最大分组为2位数。
teststr = '1L/63P/751';
test = str2double(regexp(teststr, '\d{1,2}', 'match'));
返回以下数组:
test =
1 63 75 1
我建议您使用在线正则表达式测试程序来查看输入如何影响结果。我最喜欢的是regex101。它适用于其他语言,但MATLAB语法在大多数情况下都相似。
答案 2 :(得分:1)
将您的数据定义为字符串的单元格数组:
s = {'L/22P/93'
'P/8P/48L/3'
'1L/63P/751'
'PL/18'
'P/30P/5'
'PP'};
然后
y = regexp(s, '\d+', 'match'); %// cell array of cell arrays of strings
y = cellfun(@str2double, y, 'uniformoutput', 0); %// convert to cell array of vectors
将结果作为向量的单元格数组:
y{1} =
22 93
y{2} =
8 48 3
y{3} =
1 63 751
y{4} =
18
y{5} =
30 5
y{6} =
[]