动态提取字符串Perl/Regex的多个部分
所以这可能有一个非常简单的解决方案,但我对Perl非常熟悉。。。。为了简单起见,我将使用一个简单的示例:动态提取字符串Perl/Regex的多个部分,regex,perl,Regex,Perl,所以这可能有一个非常简单的解决方案,但我对Perl非常熟悉。。。。为了简单起见,我将使用一个简单的示例: # extract hours, minutes, seconds $time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format $hours = $1; $minutes = $2; $seconds = $3; #!/usr/bin/env perl use strict; use warnings; use Data::Dumpe
# extract hours, minutes, seconds
$time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format
$hours = $1;
$minutes = $2;
$seconds = $3;
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $str = "11:22:33 somefhunakdawer 14:32:17";
my @matches = $str =~ /(\d\d):(\d\d):(\d\d)/g;
print Dumper \@matches;
我正在编写的应用程序允许用户输入一个regex字符串,该字符串可能有多个匹配项,如示例中所示。我正在寻找一种方法,根据用户输入的正则表达式来知道有多少可用的$
。是否有办法查看当前匹配过程中是否定义了$1、$2….$n?我正在使用:
$parsed_response=~/$block_start_regex/代码>
其中$block\u start\u regex可能类似于$block\u start\u regex=qr/(\S+)\S+(\S+)\S+(\S+)/代码>或用户输入的任何内容
另外,如果我在代码前面匹配了9个变量,那么下次运行正则表达式匹配时,它们是否都设置为未定义?如果匹配正则表达式,则可以将“匹配”捕获到数组中:
my @matches = $time =~ /(\d\d):(\d\d):(\d\d)/g;
然后,这将匹配多次,并将“命中”链接到@matches
数组中
以你上面的例子来说:
# extract hours, minutes, seconds
$time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format
$hours = $1;
$minutes = $2;
$seconds = $3;
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $str = "11:22:33 somefhunakdawer 14:32:17";
my @matches = $str =~ /(\d\d):(\d\d):(\d\d)/g;
print Dumper \@matches;
这将为您提供一个包含以下内容的阵列:
$VAR1 = [
'11',
'22',
'33',
'14',
'32',
'17'
];
虽然-您必须以3元素块的形式读取数组
或者,您可以将捕获的内容“分组”,具体取决于您的目标:
my $str = "11:22:33 somefhunakdawer 14:32:17";
my $pattern = qr/(\d\d):(\d\d):(\d\d)/;
my @matches = $str =~ m/($pattern)/g;
print Dumper \@matches;
这将为您提供:
$VAR1 = [
'11:22:33',
'11',
'22',
'33',
'14:32:17',
'14',
'32',
'17'
];
接受输入模式并“合并”它有点困难,但您可以执行以下操作:
my $str = "11:22:33 somefhunakdawer 14:32:17";
my $pattern = qr/\d\d:\d\d:\d\d/;
my @matches = map {[ split /:/ ]} $str =~ m/($pattern)/g;
print Dumper \@matches;
这将选择$pattern
的实例,然后使用map
在分隔符上将其拆分为子数组。因此,我们得到:
$VAR1 = [
[
'11',
'22',
'33'
],
[
'14',
'32',
'17'
]
];
不过,在这两种情况下,您都需要更具逻辑性—您可以看出,如果您的输入中有3个捕获组,那么您的@匹配中将有3的倍数
如果要动态检测,可能需要进行双重匹配:
my $str = "11:22:33 somefhunakdawer 14:32:17";
my $pattern = qr/(\d\d):(\d\d):(\d\d)/;
my @matches = $str =~ m/$pattern/;
my $num_groups = @matches;
@matches = $str =~ m/$pattern/g;
while ( @matches ) {
print "Group : ", join ("-", splice ( @matches, 0, $num_groups )),"\n";
}
第一个捕获(不带g
)告诉您此模式生成了多少个捕获组
然后,使用g
,运行第二次捕获,将捕获重复到阵列中,然后从匹配列表中提取多个捕获组
尽管注意-如果输入模式中存在变量捕获组,此方法将失败-例如
my $pattern = qr/(\d{2}):(\d{2})(?::(\d{2}))?/;
它有可选的“秒”匹配Yep,简单地将它们存储在数组中就足以让我使用我的基本perl知识使其工作。其他分组和捕获方法非常有教育意义,谢谢!