如何在Matlab / Octave中使用正则表达式正则表达式来查找重叠的匹配项

问题描述

说我想使用Matlab或Octave的regexp函数来查找子字符串'var'的出现位置,该子字符串在或或:之前以及或或:(逗号或冒号)之后。例如,说

line = ':var,var:'

在这种情况下,我希望答案为[2 6],因为'var'从位置2和6开始。

但是,如果我愿意

>> regexp(line,'[,:]var[,:]') + 1
   ans = 2

我只获得第一个位置2,而不得到第二个位置6。这是因为Matlab考虑了第一次出现的逗号部分,因此它被丢弃而没有用于第二个。

如何让regexp考虑重叠的比赛并返回[2 6]

解决方法

使用环顾四周:

(?<=[,:])var(?=[,:])

请参见proof

EXPLANATION

                         EXPLANATION
--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    [,:]                     any character of: ',',':'
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  var                      'var'
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    [,':'
--------------------------------------------------------------------------------
  )                        end of look-ahead