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

Regex 正则表达式:捕获重复组(Perl),regex,perl,Regex,Perl,在Perl中,我试图从以下示例字符串中捕获作为标记的单词(始终至少有一个单词): 我在这里看到的模式是:WORD,后跟n组“| WORD”[n>=0] 因此,我有: /(\w+)(?:\\124;)(\ w+*)/ 据我所知,它总是与第一个单词匹配,如果存在一对单词,则根据需要多次捕获该单词 但这不起作用,我已经尝试了以下几种版本: /^(\w+)(\\|(\w+))*$/ 。。。我遗漏了什么?您的第一个正则表达式实际上是错误的,*位于错误的位置,但我将重点介绍您的第二个正则表达式,这是正确的:

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

我在这里看到的模式是:WORD,后跟n组“| WORD”[n>=0]

因此,我有:

/(\w+)(?:\\124;)(\ w+*)/

据我所知,它总是与第一个单词匹配,如果存在一对单词,则根据需要多次捕获该单词

但这不起作用,我已经尝试了以下几种版本:

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


。。。我遗漏了什么?

您的第一个正则表达式实际上是错误的,
*
位于错误的位置,但我将重点介绍您的第二个正则表达式,这是正确的:

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

您应该改为使用
split

my @words = split /\|/, "red|white|blue";

# now $words[0] is 'red', $words[1] is 'white', $words[2] is 'blue'

你不能这样做。重复捕获组时,上一个匹配将被新组覆盖(每次重复时)。为什么不直接使用split呢?可以通过Python PyPi regex、.NET regex(CapureCollection)实现这一点还有一个选项可以在Boost正则表达式库中获取捕获。@WiktorStribiżew:您也可以使用Perl正则表达式来实现这一点——只是不像OP尝试的那样。Perl 6的
%
修改器库更酷。编辑:那么使用正则表达式不可能做到这一点吗?关于:/^(\w+)(\\124;\ w+*?$/@JesseWalton:正则表达式中的捕获组数是正则表达式的静态/词法属性,不依赖于它所匹配的字符串。如果您需要数量可变的捕获组,则单个正则表达式匹配不适合您。(
'red | white | blue'=~m/^(\w+)(\\|(\w+)))*$/
就像写
$1='red';$2='white';$3='white';$2='blue';$3='blue'
一样。它一直重复使用相同的捕获变量。)
my @words = split /\|/, "red|white|blue";

# now $words[0] is 'red', $words[1] is 'white', $words[2] is 'blue'