这在regex中意味着什么:\ g {last_name}

时间:2014-05-30 18:51:32

标签: regex perl

所以我正在研究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条件中,我知道它将第一个捕获标记为姓氏,它只捕获单词字符,但是在和之后的东西。

那里有什么详细信息?如果在后面引用中再次匹配该单词,是否打印捕获?

2 个答案:

答案 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}是对具有相同名称的捕获组的反向引用,代表使用此组捕获的内容。