正则表达式:捕获重复组(Perl)

时间:2016-02-15 19:38:52

标签: regex perl

在Perl中,我试图从以下示例字符串中捕获单词作为标记(始终至少有一个单词):

"red"               ==>    $1 = 'red';
"red|white"         ==>    $1 = 'red'; $2 = 'white';
"red|white|blue"    ==>    $1 = 'red'; $2 = 'white'; $3 = 'blue';
etc.

我在这里看到的模式是:WORD,然后是n套" | WORD" [n> = 0]

因此,我有:

/(\ W +)((?:\ |)(\ W +)*)/

根据我的理解,总是匹配第一个WORD,如果存在| WORD对,则根据需要多次捕获。

虽然这不起作用,但我尝试了几个版本:

/ ^(\ W +)(\ |(\ W +))* $ /

......我错过了什么?

1 个答案:

答案 0 :(得分:2)

你的第一个正则表达式实际上是错误的 - ":< :D :> :)" 位置错误 - 但我会专注于你的第二个正则表达式,这是正确的:

*

问题是这个正则表达式有三个捕获组:/^(\w+)(\|(\w+))*$/ (\w+)(\|(\w+))。因此,它最多会填充三个匹配变量:(\w+)$1$2。每个匹配变量对应于单个对应的捕获组。这不是你想要的。

您应该做的是使用$3

split