繁体   English   中英

如何从Matlab的字符串中获取几个数字

[英]how to get several numbers from a string in 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,但是我只能获得每个字符串的第一个数字。

一种简单的方法是将所有其他字符替换为空格,然后读取字符串:

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

尽管正则表达式可能会令人生畏,但MATLAB的regex文档相当全面,应足以帮助解决此问题。

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

  1. 到目前为止,您尝试过哪种代码仅产生第一个数字? 如@ michael_0815所言,最简单的正则表达式调用将返回字符串中所有数字的索引。
  2. 您对数字的标准是什么? 特别是在您的第三个字符串中,您说只有3个时有4个数字组。您是否只希望最大2位数字的分组? 这会影响正则表达式的结构。

同时,这应该返回您使用regex请求的内容,尽管它假设您的数字是无符号整数,并且您希望最大2位数字的分组。

teststr = '1L/63P/751';
test = str2double(regexp(teststr, '\d{1,2}', 'match'));

它返回以下数组:

test =

 1    63    75     1

我建议与在线正则表达式测试仪一起玩,看看您的输入如何影响结果。 我最喜欢的是regex101 它适用于其他语言,但是MATLAB语法在大多数情况下足够相似。

让您将数据定义为字符串的单元格数组:

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} =
     []

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM