我有一个字符串
<start><tag1><tag2><tag3><end>
如果我有一个正则表达式<.*end>
,它匹配完整的字符串并停止。是否有某种方式可以提供所有匹配的子串ike
<end>
<tag3><end>
<tag2><tag3><end>
<tag1><tag2><tag3><end>
答案 0 :(得分:4)
是的,您必须将模式包装在前瞻中(这是获得重叠结果的唯一方法):
(?=(<.*end>))
结果在捕获组1中。
答案 1 :(得分:2)
使用先行断言查找匹配项。
避免使用严格的零宽度表达式通常是一个好主意,因此在断言之外添加子表达式以吞噬单个字符。
(?=(<.*<end>)).
以下展示:
my $string = '<start><tag1><tag2><tag3><end>';
while ($string =~ /(?=(<.*end>))./g) {
print $1, "\n";
}
输出:
<start><tag1><tag2><tag3><end>
<tag1><tag2><tag3><end>
<tag2><tag3><end>
<tag3><end>
<end>