繁体   English   中英

Perl将正则表达式匹配组分配给变量

[英]Perl assign regex match groups to variables

我有一个以下格式的字符串: _num1_num2 我需要为某些变量分配num1num2值。 我的正则表达式是(\\d+) ,它在Rubular.com上显示了正确的匹配组,但我不知道如何将这些匹配组分配给某些变量。 有谁能够帮助我? 谢谢你。

那应该是(假设你的字符串存储在' $string '):

my ($var1, $var2) = $string =~ /_(\d+)_(\d+)/s; 

想法是抓住数字,直到你得到一个非数字字符:这里是' _ '。

然后将每个捕获组分配给它们各自的变量。


本问题所述 (以及Kaoru 下面的评论中):

如果应用于Unicode字符串, \\d确实可以匹配10个以上的不同字符。

所以你可以改用:

my ($var1, $var2) = $string =~ /_([0-9]+)_([0-9]+)/s; 

使用g-modifier还可以取消分组括号:

my ($five, $sixty) = '_5_60' =~ /\d+/g;

这允许任何整数分离,但它不验证输入格式。

在第一个答案中使用全局标志有点令人困惑。 正则表达式/ _(\\ d +)_(\\ d +)/已经捕获了两个整数。 此外,g修饰符尝试多次匹配。 所以这是多余的。

恕我直言,当匹配数未知或简化正则表达式时,应使用g修饰符。

据我所知,这与JavaScript中的工作方式完全相同。

这里有些例子:

use strict;
use warnings;

use Data::Dumper;

my $str_a = '_1_22'; # three integers seperated by an underscore

# expect two integert

# using the g modifier for global matching
my ($int1_g, $int2_g) = $str_a =~ m/_(\d+)/g;
print "global:\n", Dumper( $str_a, $int1_g, $int2_g ), "\n";

# match two ints explicitly
my ( $int1_e, $int2_e) = $str_a =~ m/_(\d+)_(\d+)/;
print "explicit:\n", Dumper( $str_a, $int1_e, $int2_e ), "\n";

# matching an unknown number of integers
my $str_b = '_1_22_333_4444';
my @ints = $str_b =~ m/_(\d+)/g;
print "multiple integers:\n", Dumper( $str_b, \@ints ), "\n";

# alternatively you can use split
my ( $int1_s, $int2_s ) = split m/_/, $str_a;
print "split:\n", Dumper( $str_a, $int1_g, $int2_g ), "\n";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM