2014-02-27 225 views
1

我在Perl中有以下正則表達式。Perl正則表達式不匹配

if ($line =~ m/DX/o) { 
    printf("%s.\n", $line); 
} 

if ($line =~ m/.*DX\s+.*\s+.*\s+(.*)\sGB/oi) { 
       printf("TRUE: %s\n", $1); 
       ($dx = $1) =~s/,//g; 
} 

在打印

DX 93,132 GB -- 2,145 GB 16840176 16835553.

但不進入第二個正則表達式。我檢查了正則表達式,看不到任何錯誤。任何人都可以建議嗎?

謝謝。

+1

如果您的字段全部用*多*空格分隔,則可以考慮使用'split'而不是正則表達式。 – ThisSuitIsBlackNot

+1

http://www.sscce.org – toolic

+0

無論如何,你的正則表達式被打破了:因爲'.'匹配*任何字符*和'*'是*貪婪*,它會盡可能多地吞噬,包括空白分隔符。然而,這並不妨礙匹配,它只會影響你的捕獲'$ 1'的內容。當我在你的字符串上測試時,正則表達式確實符合我的要求。我假設這些是多個空格(例如'DX'和'93,132 ...'之間有19個空格? – TypeIA

回答

2

如果你所有的領域都被多個空格分隔(即沒有任何字段都可以包含在兩個或兩個以上的空間行),我會建議使用split,而不是一個正則表達式:

if ($line =~ /^DX/) { 
    my @fields = split /\s{2,}/, $line; 
    $fields[3] =~ s/,//g; # Strip commas from 4th field 
    print $fields[3]; 
} 

__END__ 
2145 GB 

如果你的數據是實際將製表符分隔爲split

my @fields = split /\t/, $line; 
0

關注應該工作:/--\s+(\S+)\s/

+0

這並不檢查該行是否以DX開頭 – AkshaiShah

+0

'/ DX [^ - ] + - \ s +(\ S)\ s /' – amaslenn

+1

檢查該行是否以DX開頭。 – TLP

0

試試這個:

^\s*DX.*?([\d,]+)\sGB(?!.*GB)/oi