如何从matlab中的字符串中获取多个数字

时间:2015-05-27 13:16:22

标签: regex matlab

我很难从几个字符串中获取数字:

'L/22P/93'
'P/8P/48L/3'
'1L/63P/751' (this one is: 1, 63, 75, 1)
'PL/18'
'P/30P/5'
'PP'

我想得到所有数字,所以我可以用它们进行计算。

我尝试过使用regexp,但我只能得到每个字符串的第一个数字。

3 个答案:

答案 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文档相当全面,应该足以帮助解决这个问题。

正如其他人所评论的,这里有几个问题需要回答,以便为您的问题提供全面的答案:

  1. 到目前为止,您尝试了哪些代码才能生成第一个数字?正如@ michael_0815所述,最简单的正则表达式调用将索引返回给字符串中的所有数字。
  2. 您对某个号码的标准是什么?特别是在你的第三个字符串中,你说当只有3个时有4个数字组。你只想要一个2位数的最大分组吗?这会影响正则表达式的结构。
  3. 与此同时,这应该返回您使用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} =
     []