为什么MATLAB';s regexp是否只返回第一个匹配标记字符串?
假设我们在MATLAB中有以下代码:为什么MATLAB';s regexp是否只返回第一个匹配标记字符串?,regex,matlab,Regex,Matlab,假设我们在MATLAB中有以下代码: ax = 'aa+bb+cc+dd'; middle_part = regexp(ax, '\+(\w+)\+','tokens'); 为什么MATLAB只返回'bb'作为输出,而不返回'bb'和'cc'?您需要将第二个+放在前瞻中,这样它就不会被正则表达式引擎使用 下面是代码片段: ax = 'aa+bb+cc+dd'; middle_part = regexp(ax, '\+(\w+)(?=\+)','tokens'); disp(middle_par
ax = 'aa+bb+cc+dd';
middle_part = regexp(ax, '\+(\w+)\+','tokens');
为什么MATLAB只返回
'bb'
作为输出,而不返回'bb'
和'cc'
?您需要将第二个+
放在前瞻中,这样它就不会被正则表达式引擎使用
下面是代码片段:
ax = 'aa+bb+cc+dd';
middle_part = regexp(ax, '\+(\w+)(?=\+)','tokens');
disp(middle_part)
结果:
{
[1,1] =
{
[1,1] = bb
}
[1,2] =
{
[1,1] = cc
}
}
因此,简而言之,这里是发生了什么:\+(\w+)\+
匹配+bb+
,并将索引移到+
后面的+
后面。因此,只有cc+dd
需要测试。找不到匹配项,因为模式需要在1个或多个单词字符周围使用2个+
符号
使用前瞻版本,
\+(\w+(=\+)
,引擎将匹配位于+
正前方的+bb
,并将索引移动到第二个b
之后。左边的字符串是+cc+dd
。因此,还有另一个+cc
匹配项。因为您使用了后面的+
。由于重叠匹配,请使用前向“\+(\w+)(=\+)”
。@Stribizev。谢谢你的评论。为什么这个函数只在我的代码中找到第一个匹配的字符串?你能在回答中描述更多吗?@user2991243:我添加了一个扩展的答案。请点击我关于lookaheads答案的链接,这将帮助你更好地理解它们是如何工作的。这里和链接帖子中的信息很棒,谢谢分享!