3

想象一下,我正在尝试使用 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 中重复编号的捕获组如何工作感兴趣)

4

1 回答 1

3

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

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

大多数语言也有一个“匹配所有”,我不知道如何在 perl 中做到这一点。这通常会将所有匹配项存储到一个数组中,但重复组仍仅存储为最后一个匹配组。

于 2013-05-28T19:48:48.930 回答