在Perl中重复编号的捕获组

时间:2013-05-28 19:44:14

标签: regex perl

想象一下,我正在尝试使用Perl正则表达式解析以下html:

<h4>test</h4> <p>num1</p> <p>num2</p> <p>num3</p>
<h4>test</h4> <p>num1</p> <p>num2</p> <p>num3</p> <p>num4</p>

使用以下正则表达式:

<h4>([\w\s]*)</h4>(?:<p>([\w\s]+)</p>)+

如何在Perl中编号编组? $ 1显然会包含<h4>标记文字,但是当捕获组重复时,捕获的<p>标记会被发送到$ 2 $ 3和$ 4?有没有一种很好的方法来捕获数组中的所有<p>标签?这甚至是perl支持的东西吗?或者我被迫为<h4>编写一个正则表达式,然后为<p>编写另一个正则表达式?

(我知道我可以使用HTML::Tree或类似的东西来解析html,但这只是我用来帮助描述问题的简单例子,我真的只对重复的方式感兴趣编号的捕获组在Perl中工作

1 个答案:

答案 0 :(得分:3)

重复捕获组时,只有最后一个匹配的组将存储在匹配器中。

如果你想从重复组获得每个匹配,你可以使用带有回调函数的replaceAll或逐个遍历匹配。

大多数语言也有“全部匹配”,我不知道如何在perl中进行操作。这通常会将所有匹配项存储到数组中,但重复组仍仅作为最后匹配的组存储。