问题描述
说我想使用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