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

How to use regexp (regular expression) in Matlab/Octave to find overlapping matches

假设我想使用 Matlab 或 Octave 的 regexp 函数来查找子字符串 'var' 出现的位置,如果前面是 , or : 并且后面跟着 , or : (逗号或冒号) .例如,说

line = ':var,var:'

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

但是,如果我这样做

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

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

如何让 regexp 考虑重叠匹配和 return [2 6]

使用环视:

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

proof

解释

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