2011-05-16 61 views
8

有没有办法从使用量词的正规表达式中获取多个捕获组?例如,假设我有这样的数据(从我有简化处理):使用量词的多个正则表达式捕获组

<td>Data 1</td> 
<td>data 2</td> 
<td>data 3</td> 
<td>data 4</td> 

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

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

我最终只有一个捕获组,最后一个“数据4”。有没有办法使用的量词,最终以4个捕捉组,还是我不得不写这样的正则表达式来得到我想要的方式:

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

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

+3

我猜你错过了最后一段。这是“正则表达式有可能”的问题,而不是“解析html的最佳方式是什么”。 – 2011-05-16 13:11:08

+0

我已经删除了我的第一条评论,但我不同意这里的概念值得追求。正则表达式只适用于在非常简单的情况下解析HTML。这不是这样的。 – lonesomeday 2011-05-16 13:17:01

+2

同样,这不是关于解析HTML,而是关于正则表达式是否可以使用量词捕获多个组的问题。这是一个简单的例子来说明这一点。 – 2011-05-16 13:21:00

回答

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 
     ) 

) 
+0

我提高了这一点,因为更复杂的版本就是我现在正在做的。尽管如此,它并没有回答我的有关量词的正则表达式捕获组的问题。正如我在该问题的原始内容中所述,我想避免对此问题的程序化答案,并希望知道它是否可能从纯粹的正则表达式角度出发。 – 2011-05-16 14:43:23

+0

@Tony Lukasavage:谢谢。不幸的是,正如Tim Pietzcker在评论中所说的那样,在php中是不可能的。 – Toto 2011-05-16 14:49:28