如何在 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(?=[,:])
解释
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
假设我想使用 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(?=[,:])
解释
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