gpt4 book ai didi

regex - 动态提取字符串的多个部分 Perl/Regex

转载 作者:行者123 更新时间:2023-12-01 10:16:27 34 4
gpt4 key购买 nike

所以这可能有一个非常简单的解决方案,但我对 Perl 还很陌生......为了简单起见,我将使用一个简单的示例:

# extract hours, minutes, seconds
$time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format
$hours = $1;
$minutes = $2;
$seconds = $3;

我正在编写的应用程序允许用户输入可能具有多个匹配项的正则表达式字符串,如示例中所示。我正在寻找一种方法来了解有多少 $<n>根据用户输入的正则表达式,我可以使用它。有没有办法查看在当前匹配过程中是否定义了 $1,$2....$n?我在用着: $parsed_response =~ /$block_start_regex/;其中 $block_start_regex 可能类似于 $block_start_regex=qr/(\S+)\s+(\S+)\s+(\S+)/;或者用户输入的任何内容......

此外,如果我在前面的代码中匹配了 9 个变量,那么在我下次运行正则表达式匹配时它们是否都设置回未定义?

最佳答案

如果您要匹配一个正则表达式,您可以将“匹配项”捕获到一个数组中:

my @matches = $time =~ /(\d\d):(\d\d):(\d\d)/g;  

然后这将匹配多次,并将“命中”插入到 @matches 数组中。

以你上面的例子为例:

#!/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 元素 block 的形式读取数组。

或者 - 您可以“分组”您的捕获,具体取决于您所追求的内容:

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 个捕获组,那么您的 @matches

如果你想动态检测,你可能会双重匹配:

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}))?/; 

它有可选的“秒”匹配

关于regex - 动态提取字符串的多个部分 Perl/Regex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35778278/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com