所以我正在研究Perl正则表达式的一些例子(我对正则表达式的世界很新)
我看到了这句话:
my $names = 'Fred Flintstone and Wilma Flintstone';
if ( $names =~ m/(?<last_name>\w+) and \w+ \g{last_name}/ ){
print "I saw $+{last_name}";
}
在if条件中,我知道它将第一个捕获标记为姓氏,它只捕获单词字符,但是在和之后的东西。
那里有什么详细信息?如果在后面引用中再次匹配该单词,是否打印捕获?
答案 0 :(得分:2)
if ( $names =~ m/(?<last_name>\w+) and \w+ \g{last_name}/ ){
这里的诀窍是意识到and
不代表布尔操作,而是出现在字符串and
中的文本$names
。
让我们更简单一点:
my $names = 'Fred Flintstone and Wilma Flintstone';
if ( $names =~ /(\w+) and \w+ \1/ ) {
say "There's a matching last name: $1";
}
我在这里使用更熟悉的相对形式的捕获。让我们来看看匹配:
(\w+)
匹配&#34; Flintstone&#34;并创建一个捕获组。and
匹配&#34;和&#34; \w+
匹配&#34; Wilma&#34; \1
与第一个捕获组Flintstone
匹配。
这将打印出&#34;匹配的姓氏:Flintstone
此:
my $names = 'Fred Flintstone and Barney Rubble';
if ( $names =~ /(\w+) and \w+ \1/ ) {
say "There's a matching last name: $1";
}
不会打印任何东西,因为&#34; Rubble&#34;与\1
选择器不匹配。
答案 1 :(得分:0)
\w
是一个等同于[a-zA-Z0-9_]
的字符类(或所有可能字母表中的所有字母和数字,具体取决于上下文,加上下划线)
+
是重复1次或更多次的量词。
\g{last_name}
是对具有相同名称的捕获组的反向引用,代表使用此组捕获的内容。