如何匹配之前已经匹配的文本?

时间:2014-07-02 02:38:58

标签: regex

我有一个像aaa**b***c****ddd这样的字符串,我希望获得一系列匹配的模式[^*]\*+[^*],我应该感谢[a**b, b***c, c***d]。但是,当我在文本编辑器(如vim或emacs)中测试时,第二个(b***c)不匹配。

aaa**b***c***ddd
  |--|   |---|
  first  third
     |---|
     second, which I think should be matched but not 

我应该如何修改正则表达式以匹配第二个?

2 个答案:

答案 0 :(得分:3)

是的,你可以,诀窍在于将所有捕获组放在预测中以允许重叠结果:

(?=([^*]\*+[^*]))

但是你不能用这个做替换,因为这种模式不匹配。 (或者如果你可以获得捕获组长度和当前偏移量)

编辑:

似乎可以使用带strlen(submatch(1))

的vim获取捕获组长度

答案 1 :(得分:1)

@CommuSoft是正确的。解决此问题的一种方法是将整个字符串与此正则表达式匹配,然后第二次将此正则表达式与从(index_of_first_previous_match + 1)开始的子字符串匹配,直到字符串结束。希望很清楚。

所以如果上面第一个匹配的索引(a ** b)是2.那么第二次与正则表达式匹配的新子字符串应该从索引3开始直到字符串结尾。这将给你两个结果。

然而,卡西米尔的回答要简单得多。