我有一个像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
我应该如何修改正则表达式以匹配第二个?
答案 0 :(得分:3)
是的,你可以,诀窍在于将所有捕获组放在预测中以允许重叠结果:
(?=([^*]\*+[^*]))
但是你不能用这个做替换,因为这种模式不匹配。 (或者如果你可以获得捕获组长度和当前偏移量)
编辑:
似乎可以使用带strlen(submatch(1))
答案 1 :(得分:1)
@CommuSoft是正确的。解决此问题的一种方法是将整个字符串与此正则表达式匹配,然后第二次将此正则表达式与从(index_of_first_previous_match + 1)开始的子字符串匹配,直到字符串结束。希望很清楚。
所以如果上面第一个匹配的索引(a ** b)是2.那么第二次与正则表达式匹配的新子字符串应该从索引3开始直到字符串结尾。这将给你两个结果。
然而,卡西米尔的回答要简单得多。