Perl短形式的正则表达式捕获

时间:2014-08-18 11:01:52

标签: regex perl

我想只将第一个捕获组放入同一个var中。事实上,我正在寻找一个简短的形式:

$_ = $1 if m/$prefix($pattern)$suffix/;

类似的东西:

s/$prefix($pattern)$suffix/$1/a; ## Where a is the option I am looking for

甚至更好:

k/$prefix($pattern)$suffix/; ## Where k is also an option I wish I can use...

这样可以避免匹配导致更复杂行的所有文本:

s/^.*$prefix($pattern)$suffix.*$/defined $1 ? $1 : ""/e;

任何线索?

这对此示例很有用:

push @array, {id => k/.*\s* = \s* '([^']+)'.*/};

而不是

/.*\s* = \s* '([^']+)'.*/;
my $id = '';
$id = $1 if $1;
push @array, {id => $id};

修改:

我刚刚发现了一种有趣的方式,但如果未定义$1,我将收到错误:(

$_ = (/$prefix($pattern)$suffix/)[0];

3 个答案:

答案 0 :(得分:1)

您可以使用/r开关返回更改后的字符串,而不是对变量进行替换。没有必要捕捉任何东西。只需删除前缀和后缀,并将该操作的结果添加到数组中。

use Data::Dump;

my @strings = qw( prefixcontent1suffix prefixcontent2suffix );
my @array = map { s/^prefix|suffix$//gr } @strings;

dd @array;

__END__

("content1", "content2")

如果您希望它是可配置的,那么:

my $prefix = qr/.+\{\{/;
my $suffix = qr/\}\}.+/;
my @strings = ( '{fo}o-_@09{{content1}}bar42' );
my @array = map { s/^$prefix|$suffix$//gr } @strings;

dd @array;

__END__
"content1"

答案 1 :(得分:1)

在列表上下文中,m//运算符将捕获作为列表返回。这意味着你可以这样做:

($_) = m/$prefix($pattern)$suffix/;

或者这个:

my ($key, $value) = $line =~ m/^([^=]+)=([^=]+)$/;

答案 2 :(得分:1)

使用Conditional operator

my $var = /$prefix($pattern)$suffix/ ? $1 : '';

在使用捕获组之前,您总是希望确保正则表达式匹配。通过使用三元组,您可以指定默认值,也可以warn找不到匹配项。

或者,您可以在if语句中使用捕获组的列表形式,并让else输出警告:

if (my ($var) = /$prefix($pattern)$suffix/) {
    ...;
} else {
    warn "Unable to find a match";
}