Regex 确定在字符串中查找匹配项时使用了Perl正则表达式的哪一部分 背景

Regex 确定在字符串中查找匹配项时使用了Perl正则表达式的哪一部分 背景,regex,perl,Regex,Perl,Perl为匹配正则表达式的字符串部分提供(例如,$MATCH、$&或${^MATCH},为匹配部分之前的字符串部分提供$PREMATCH、$`,等等) 问题: 有没有办法获取正则表达式中实际用于匹配$match的部分 例子 例如,假设我有 my $string = "gC rL Ht Ns B lR cG sN tH"; my $re = qr/\b(a|b|c)\b/i; $string =~ $re; print "${^PREMATCH}\n"; print "$&\n"; pri

Perl为匹配正则表达式的字符串部分提供(例如,
$MATCH
$&
${^MATCH}
,为匹配部分之前的字符串部分提供
$PREMATCH
$`
,等等)

问题: 有没有办法获取正则表达式中实际用于匹配
$match
的部分

例子 例如,假设我有

my $string = "gC rL Ht Ns B lR cG sN tH";
my $re = qr/\b(a|b|c)\b/i;
$string =~ $re;
print "${^PREMATCH}\n";
print "$&\n";
print "${^POSTMATCH}\n";
输出将是

gC-rL-Ht-Ns
B
lR cG sN tH
期望输出 正则表达式(
/\b(a | b | c)\b/i
)中与字符串匹配的部分是
b
,或者更恰当地说是
\bb\b
,带有不区分大小写的开关
i
。如何获得
b
(理想情况下)或
\bb\b
?我找不到任何内置变量来存储匹配的正则表达式的任何部分,只存储字符串的部分

答复 由于在的答案中有很好的提示,似乎使用和将起作用:

$ perl -MData::Dumper -e '
    "gC rL Ht Ns B lR cG sN tH" =~ /\b((?<a>a)|(?<b>b)|(?<c>c))\b/i;
    print Dumper keys %+;'
$VAR1 = 'b';
$perl-MData::Dumper-e'
“gC rL Ht Ns B lR cG sN tH”=~/\B((?a)|(?B)|(?c))\B/i;
打印转储程序键%+;'
$VAR1='b';

这通常是不可能的,因为正则表达式可能非常复杂。字符串
bydgijj
匹配
(?:ax | by)[cd]*(ef | g[hi](?:j{2,}klm))
,您希望它返回什么?你能想象它有多复杂吗

您必须以正则表达式告诉您的方式构造正则表达式:

"gC rL Ht Ns B lR cG sN tH" =~ /\b((a)|(b)|(c))\b/i;
print "a:$2\nb:$3\nc:$4\n"

您的目标是
qr/\b$1\b/
。只是出于好奇,你为什么需要它?我不知道
qr/\b$1\b/
怎么可能工作
$1
设置为处理正则表达式的字符串的值。我需要相反的。我需要用于匹配字符串的正则表达式部分。为了挑剔:
$1
还只包含组匹配的字符串部分,而不包含模式中与之匹配的元素。当然,如果两者之间没有明确的一对一关系,那么这种模式就有问题,只是说。但例如,对于更复杂模式的哪个部分(每个可能元素可以匹配多个事物的模式)的统计,只存储模式的匹配部分而不是字符串的一部分可能会很有用。另一方面:从
$1
的内容中肯定可以找到所需的数据。是的,我意识到它可能变得非常复杂,非常快。你的方法似乎是合理的。只需找到未定义的组即可。可能使用命名组,其中名称是(在我的例子中很简单)实际的备选名称,可能会非常有效。根据您的建议,“%+”哈希表的键只列出已捕获(因此与定义值关联)的缓冲区的名称。,因此,将捕获组命名为与其捕获的相同可能会起作用。