使用量词的多个正则表达式捕获组

8
有没有办法从使用量词的正则表达式中获取多个捕获组?例如,假设我有以下数据(简化自我处理的数据):
<td>Data 1</td>
<td>data 2</td>
<td>data 3</td>
<td>data 4</td>

现在,如果我写一个像这样的正则表达式:

(?:<td>(.+?)<\/td>\s*){4}

我最终只得到了一个捕获组,即最后一个"data 4"。是否有办法使用量词并最终得到4个捕获组,或者我必须像这样编写正则表达式才能得到我想要的结果:

<td>(.+?)<\/td>\s*<td>(.+?)<\/td>\s*<td>(.+?)<\/td>\s*<td>(.+?)<\/td>

是的,我很清楚我可以通过编程更轻松地破解这个简单的示例,然后应用任何必要的正则表达式或更简单的模式匹配。 我正在处理的数据要复杂得多,我真的很想使用正则表达式来处理所有解析。


3
我猜你错过了最后一段。这是一个关于“使用正则表达式是否可能实现某些事情”的问题,而不是“解析HTML的最佳方式”问题。 - Tony Lukasavage
我已经删除了我的第一条评论,但我不同意这里的概念值得追求。正则表达式仅适用于在非常简单的情况下解析HTML。这不是这种情况。 - lonesomeday
2
再次强调,这不是关于解析HTML的问题,而是关于正则表达式是否能够使用量词捕获多个组的问题。这是一个简单的例子,用来说明这一点。 - Tony Lukasavage
1
太遗憾了。Perl 6和.NET有能力访问重复组中的单个匹配,而PHP则没有。 - Tim Pietzcker
1个回答

9
使用 PHP,您可以使用 preg_match_all
$str = '<td>Data 1</td>
<td>data 2</td>
<td>data 3</td>
<td>data 4</td>
';
preg_match_all('/(?:<td>(.+?)<\/td>\s*)/', $str, $m);
print_r($m);

输出:

Array
(
    [0] => Array
        (
            [0] => <td>Data 1</td>

            [1] => <td>data 2</td>

            [2] => <td>data 3</td>

            [3] => <td>data 4</td>

        )

    [1] => Array
        (
            [0] => Data 1
            [1] => data 2
            [2] => data 3
            [3] => data 4
        )

)

我点赞了这个回答,因为我已经在做一个更复杂的版本。但是它并没有回答我的问题,即关于带量词的正则表达式捕获组。正如我在问题的原始内容中所述,我想避免编程式的答案,并想知道是否可能从纯正则表达式的角度来解决这个问题。 - Tony Lukasavage
@Tony Lukasavage:谢谢。不幸的是,正如Tim Pietzcker在评论中所说,这在php中是不可能的。 - Toto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接