与正则表达式匹配的所有可能的子字符串

时间:2014-06-27 21:23:15

标签: regex perl

我有一个字符串

<start><tag1><tag2><tag3><end>

如果我有一个正则表达式<.*end>,它匹配完整的字符串并停止。是否有某种方式可以提供所有匹配的子串ike

<end>
<tag3><end>
<tag2><tag3><end>
<tag1><tag2><tag3><end>

2 个答案:

答案 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>