为什么我的正则表达式匹配多次?

时间:2013-09-03 21:01:47

标签: regex matlab

我有以下行,我想通过正则表达式捕获几个字符串:

l = '15                 1180       62444    e0e0                   049c     f3ec      104';

我正在扩充以下正则表达式来操作这一行:

d = regexpi(l, '([0-9a-f]+)\s?', 'tokens');

执行此行时,我得到length(d) == 7。 regexp不应该只匹配第一次出现,即length(d) == 1d{1} == '15'

为了它的价值,我在Perl中使用了相同的正则表达式,发现它只匹配模式的第一个实例(这是我所期望的):

my $l = ... #defined above already
$l =~ m/([0-9a-f]+)\s?/i;

if (! defined($2)){ # $2, $3, ..., $n will be defined for n matches
    print "Didn't match twice!\n"; # this prints when I execute the script
}

2 个答案:

答案 0 :(得分:2)

如使用regexpi ...

所述

start = regexpi(str,expr)返回一个行向量,start,包含str中与正则表达式字符串expr匹配的子串的索引,无论大小写如何。

当str或expr是字符串的单元格数组时,regexpi返回索引行向量的m-by-n单元格数组,其中m是str中字符串的数量,n是正则表达式模式的数量在expr。

[start,finish] = regexpi(str,expr)返回一个额外的行向量结束,它包含start中相应子字符串的最后一个字符的索引。

[start,finish,tokens] = regexpi(str,expr)返回1-by-n单元格数组,标记开始和结束时相应子字符串中的标记的开始和结束索引。在表达式expr。

中用括号表示标记

[...] = regexpi(str,expr,'once')找到第一场比赛。 (默认情况下,regexp返回所有匹配项。)如果未找到匹配项,则所有返回值均为空。

答案 1 :(得分:0)

MatLab's regexpi page,您应该查找的第一页regexpi

  

返回每个子字符串的起始点,该子字符串与正则表达式指定的字符模式匹配。

你得到一个起始位置数组,第一个元素d{1}将是第一个匹配的偏移,而不是它的'value'。