Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态提取字符串Perl/Regex的多个部分_Regex_Perl - Fatal编程技术网

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

动态提取字符串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

所以这可能有一个非常简单的解决方案,但我对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::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知识使其工作。其他分组和捕获方法非常有教育意义,谢谢!