Regex 如何计算正则表达式捕获组中的匹配数-Perl

Regex 如何计算正则表达式捕获组中的匹配数-Perl,regex,bash,perl,capture-group,Regex,Bash,Perl,Capture Group,我需要一种使用Perl或Bash计算正则表达式捕获组中匹配数的方法。我可以在Powershell中执行此操作,但不能使用这两种语言中的任何一种。你们帮我让我的正则表达式正常工作,但我看到的每个例子都打印了捕获组。打印匹配结果对我没有帮助,我需要计算每组的匹配数 下面是regexing的示例数据(这是命令的输出,因此不是静态数据,也不是来自文件) 我不能使用命名捕获组,因为我使用的是Perl 5.8.5 我的正则表达式 在上述两个国家/地区的代码>{Status}eq'0'}@rows; 最后,

我需要一种使用Perl或Bash计算正则表达式捕获组中匹配数的方法。我可以在Powershell中执行此操作,但不能使用这两种语言中的任何一种。你们帮我让我的正则表达式正常工作,但我看到的每个例子都打印了捕获组。打印匹配结果对我没有帮助,我需要计算每组的匹配数

下面是regexing的示例数据(这是命令的输出,因此不是静态数据,也不是来自文件)

我不能使用命名捕获组,因为我使用的是Perl 5.8.5

我的正则表达式

在上述两个国家/地区的代码><上述上述两个国家/以下以下以下两个州/以下以下两个州/以下以下两个州/以下两个州/以下以下两个州/以下两个州/以下以下两个州/以下以下两个州/以下以下两个州/以下两个州/以下以下两个州/以下以下以下两个州/以下以下以下以下两个州/以下以下以下以下两个州/以下以下以下两个州/以下以下以下以下两个(以下两个州/以下两个州/以下)))的(以下以下两个州/鉴于鉴于鉴于鉴于上述上述上述上述上述两个州/以下以下两个州//以下两个州/鉴于鉴于鉴于鉴于鉴于鉴于上述上述上述上述两个州/鉴于鉴于鉴于鉴于鉴于鉴于鉴于鉴于上述上述两个州/鉴于鉴于鉴于上述上述上述上述上述两个州/鉴于鉴于鉴于鉴于鉴于上述两个州/或(或(或(或上述上述两个州/鉴于鉴于鉴于鉴于鉴于鉴于上述上述两两两两个\d\W]+\b))?\s+(\W+.\W+.\W+)(\W+)\s+(\W+.\W+.\W+)(\W+))\s+(\d+)/g

每个捕获组对应一个列,我需要将捕获组的结果拉入一个变量,这样我就可以使用某种
where{$var-eq'0'}.count进行计数。假设
状态-eq“0”
表示成功备份,我需要计算状态捕获组中成功备份的数量

最终输出类似于

Statistic.SUCCESSFUL:20

我已经使用Powershell实现了这一点,但Perl完全不同,Bash似乎有限。如果有人知道如何用这两种语言中的任何一种来完成上述任务,我将不胜感激

亲切问候,

DJ箕斗式掘进机 我的$successions=0; 而(){ 咀嚼; 我的@row=// 或者{ 模具(“行$。与图案不匹配\n”); 下一个 }; ++如果$row[3]等式为“0”,则为$SUCCESS; }
您还可以命名这些列

<>;  # Skip header

my $successes = 0;
while (<>) {
   chomp;
   my %row;
   @row{qw( JobID Type State Status ... )}  = /.../
      or do {
         die("Line $. doesn't match pattern\n");
         next;
      };

   ++$successes if $row{Status} eq '0';
}
#箕斗式掘进机
我的$successions=0;
而(){
咀嚼;
我的%行;
@行{qw(作业ID类型状态…}=//
或者{
模具(“行$。与图案不匹配\n”);
下一个
};
++如果$row{Status}eq“0”,则为$successfuls;
}
最后,如果希望将数据存储在数据结构中以供以后分析,也可以这样做

<>;  # Skip header

my @rows;
while (<>) {
   chomp;
   my %row;
   @row{qw( JobID Type State Status ... )}  = /.../
      or do {
         die("Line $. doesn't match pattern\n");
         next;
      };

   push @rows, \%row;
}

my $successes = grep { $_->{Status} eq '0' } @rows;
#箕斗式掘进机
我的@行;
而(){
咀嚼;
我的%行;
@行{qw(作业ID类型状态…}=//
或者{
模具(“行$。与图案不匹配\n”);
下一个
};
按@行,\%行;
}
my$Successfulls=grep{$\->{Status}eq'0'}@rows;
最后,这个正则表达式模式…糟糕透了。我会这样说:

sub trim(_) { $_[0] =~ s/^\s++|\s++\z//rg }

my $pattern;
my @headers;
{
   my $header_line = <>;
   chomp($header_line);
   $header_line =~ s/\bDest Media Svr\b/Dest_Media_Svr/;
   $header_line =~ s/\bActive PID\b/Active_PID/;
   $pattern = join '', map { "A".length($_) } $header_line =~ /\s*\S+/g;
   @headers = map trim, unpack $pattern, $header_line;
}

my @rows;
while (<>) {
   chomp;
   my %row; @row{@headers} = map trim, unpack $pattern, $_;
   push @rows, \%row;
}

my $successes = grep { $_->{Status} eq '0' } @rows;
sub-trim({$\u0]=~s/^\s++\s++\z//rg}
我的美元模式;
我的@headers;
{
我的$header_行=;
chomp($header_line);
$header_line=~s/\b存储媒体Svr\b/Dest_媒体Svr/;
$header_line=~s/\b活动PID\b/Active_PID/;
$pattern=join'',映射{“A”.length($\u)}$header\u line=~/\s*\s+/g;
@headers=地图修剪,解包$pattern,$header\u行;
}
我的@行;
而(){
咀嚼;
我的%row;@row{@headers}=映射修剪,解包$pattern,$\;
按@行,\%行;
}
my$Successfulls=grep{$\->{Status}eq'0'}@rows;

你是在要求
my@captures=$string=~/…/?我假设这会将我的所有匹配项放入一个数组中。例如,我可以计算捕获组1
$1
中的匹配数吗?如果是这样的话,我该怎么做?
$1
中正好有一个字符串。我看到您使用了
/g
。不要那样做。匹配每一行。我只想知道如何计算捕获组中的匹配数…$1是一个捕获组,它包含“JobID”列内容。
<>;  # Skip header

my @rows;
while (<>) {
   chomp;
   my %row;
   @row{qw( JobID Type State Status ... )}  = /.../
      or do {
         die("Line $. doesn't match pattern\n");
         next;
      };

   push @rows, \%row;
}

my $successes = grep { $_->{Status} eq '0' } @rows;
sub trim(_) { $_[0] =~ s/^\s++|\s++\z//rg }

my $pattern;
my @headers;
{
   my $header_line = <>;
   chomp($header_line);
   $header_line =~ s/\bDest Media Svr\b/Dest_Media_Svr/;
   $header_line =~ s/\bActive PID\b/Active_PID/;
   $pattern = join '', map { "A".length($_) } $header_line =~ /\s*\S+/g;
   @headers = map trim, unpack $pattern, $header_line;
}

my @rows;
while (<>) {
   chomp;
   my %row; @row{@headers} = map trim, unpack $pattern, $_;
   push @rows, \%row;
}

my $successes = grep { $_->{Status} eq '0' } @rows;