用perl中的regex提取子字符串

时间:2014-12-11 16:03:03

标签: regex perl

我是正则表达式世界的新手,我有一个简单的问题(我认为)从perl中的档案中提取信息。 这个档案有200 000行aprox,有些行有这种格式

WO      GB111MTD1                    dddD-51   TIME 141202 0105  PAGE  1

我想输入一个变量GB111MTD1,我知道这个词总是" WO"是第一个。

我尝试的是以下内容:

open(archive," C:/Users/g/Desktop/c/alarms.log")或die" blah \ n";

while(< archive>){
        if($_ =~ /^WO\s+(.*)/){
            print "Found: $1\n";
            last;
        }
}

这打印了我所有的线,我只想要&#34; GB111MTD1&#34;。

---下一个意图

while(< archive>){
        if($_ =~ /^WO\s+(.*)\S/){
            print "Found: $1\n";
            last;
        }
}

我想在这里说&#34;如果该行以WO开头并且有一些空格,请匹配下一步,直到找到其他空格&#34;

在这里,唯一的区别是&#34; 1&#34; WO GB111MTD1 dddD-51 TIME 141202 0105 PAGE 1未显示但仍不是我想要的

我希望你能理解我的问题。

此致

2 个答案:

答案 0 :(得分:4)

您可以将\S用于非空格字符:

use warnings;
use strict;

while (<DATA>) {
    if (/^WO\s+(\S+)/) {
        print "Found: $1\n";
        last;
    }
}

__DATA__
WO GB111MTD1 dddD-51 TIME 141202 0105 PAGE 1

打印:

Found: GB111MTD1

答案 1 :(得分:1)

我会在以WO开头的行上使用split。

 use warnings;
 use strict;

 while (<DATA>) {
     if (/^WO\s/) {
         my @fields = split(/\s+/);
         my $myvar = $fields[1];
         # do stuff with $myvar
         say "Frobnicating order # $myvar";
     }
 }

 __DATA__
 WO GB111MTD1 dddD-51 TIME 141202 0105 PAGE 1