正则表达式匹配多个模式

时间:2017-05-09 21:53:34

标签: regex perl

我工作了将近3个小时,但我无法找到解决方案。所以我来这里是为了你的帮助。

下面是我的测试字符串:

Object: TLE-234DSDSDS324-234SDF324ER
  Page location: SDEWRSD3242SD-234/324/234 (1)
    org-chart           Lorem ipsum dolor    consectetur adipiscing          # Colorado
    234DSDSDS324-32-4/2/7-page2 (2) loc log  Apr 18 21:42:49 2017           1
      Page information: 3.32.232.212.23, Error: fatal, Technique: color
        Comments: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
      Validation status: Lorem ipsums dolors sits amets, consectetur adipiscing elit
       Positive control-export: Validated
  Page location: SDEWRSD3242SD-SDF/234/324 (5)
    org-chart           Lorem ipsum dolor    consectetur adipiscin          # Arizona
    234DSDSDS324-23-11/1/0-page1 (1) loc log Apr 18 21:42:49 2017           1
      Page information: 3.32.232.212.23, Error: log, Technique: color
        Comments: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
      Validation status: Lorem ipsums dolors sits amets, consectetur adipiscing elit
       Positive control-export: Validated

我需要在" Page location:"," Object:"之后捕获字符串。和"评论:"

例如:

对象: TLE-234DSDSDS324-234SDF324ER - 第1组

页面位置: SDEWRSD3242SD-234/324/234(1) - 第2组

页面位置: SDEWRSD3242SD-SDF / 234/324(5) - 第3组

评论: Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 - Group 4

评论: Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 - 第5组

这是我的regex url

我能够捕获字符串,但是如果任何一个字符串重复,则正则表达式不会捕获。

任何帮助都将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:1)

(请参阅问题描述问题下方的评论。)

数据采用多行字符串,多个部分以Object:开头。每个行中都有多个以短语Page location:Comments:开头的行。需要捕获所有这些内容的其余部分,并由Object s。

组织

不要尝试折磨的多行“单一”正则表达式,而是将字符串分成几行并逐段处理。这样问题变得非常简单。

结果存储在hashrefs数组中;每个键都有键显示的短语。由于它们每个部分可以出现多次,因此它们的值是arrayrefs(在行上跟随它们)。

use warnings;
use strict;
use feature 'say';

my $input_string = '...'; 
my @lines = split /\n/, $input_string;

my $patt = qr/Object|Page location|Comments/;

my @sections;
for (@lines) 
{
    next if not /^\s*($patt):\s*(.*)/;

    push @sections, {}  if $1 eq 'Object';

    push @{ $sections[-1]->{$1} }, $2;
}

foreach my $sec (@sections) {
    foreach my $key (sort keys %$sec) {
        say "$key:";
        say "\t$_" for @{$sec->{$key}};
    }   
}

复制输入字符串(为简洁起见,上面禁止),输出为

Comments:
        Lorem ipsum dolor sit amet,  [...] 
        Lorem ipsum dolor sit amet,  [...]
Page location:
        SDEWRSD3242SD-234/324/234 (1)
        SDEWRSD3242SD-SDF/234/324 (5)
Object:
        TLE-234DSDSDS324-234SDF324ER

一些评论。

找到Object行后,我们会向@sections添加新的hashref。然后将模式的匹配设置为键,并将其余部分添加到其arrayref值。这是针对@sections的当前(最后)元素完成的。

如果模式后面没有任何内容,则会添加一个空字符串。禁止添加next if not $2;

请注意。打印复杂数据结构的一种简单而常见的方法是通过核心模块Data::Dumper。但另请参阅Data::Dump以获得更紧凑的打印输出。