2012-12-17 70 views
3

我想從下面的字符串中提取日期,月份和年份。提取月份,日期,年份使用拆分

my $test_str = "Jan 01, 2004 Feb 01, 2004 Mar 01, 2004 Apr 01, 2004 May 01, 2004"; 
foreach $s (split('\t', $test_str)) { 
    my ($m, $d, $y) = split('[\s|,\s]'); 
    print ("$m=$d=$y\n"); 
} 

當我打印輸出時,$ y總是空的。難道我做錯了什麼?我的regx是

[\s|,\s] # match a space or space and a comma 

回答

1

使用strict和warnings,你會發現$s會導致編譯錯誤。

然後

my ($m, $d, $y) = split('\s|,\s', $s); 

我剛剛擺脫了[]支架和它工作得很好。

4

split正則表達式[\s|,\s]是字符類(由[]括號表示),這意味着:「上的單個字符或者是一個空白,管|,逗號或空白分裂(再次)」。您將字符串Jan 01, 2004分爲四個字符串:

"Jan" 
"01" 
""  # comma + whitespace creates empty string 
"2004" 

你也分裂的$_變量,但我認爲這是一個錯字。

解決您的問題,改變該行:

my ($m, $d, $y) = split(/[\s,]+/, $s); 

正如你所看到的,使用+量詞將剝離多個連續的逗號或空格。

0

嘗試:

my $test_str = "Jan 01, 2004 Feb 01, 2004 Mar 01, 2004 Apr 01, 2004 May 01, 2004"; 
foreach my $s (split(/\t/, $test_str)) { 
    my ($m, $d, $y) = split(/\s|,\s/,$s); 
    print ("$m=$d=$y\n"); 
} 

這給你想要的輸出:

Jan=01=2004 
Feb=01=2004 
Mar=01=2004 
Apr=01=2004 
May=01=2004 

正如誰回答其他人提到的,[\s|,\s]是一個字符類匹配的\s|只有一個,或者,(這顯然不是你想要的)。

2

你也可以這樣做:split /,?\s/, $s;

0

而不是使用split,在這種情況下更簡單的是找到目標字符串中的所有字母數字子字符串。 \w模式匹配字母數字加下劃線字符,並且爲此目的足夠準確。

use strict; 
use warnings; 

my $test_str = "Jan 01, 2004\tFeb 01, 2004\tMar 01, 2004\tApr 01, 2004\tMay 01, 2004"; 

foreach (split /\t/, $test_str) { 
    my ($m, $d, $y) = /\w+/g; 
    print "$m=$d=$y\n"; 
} 

輸出

Jan=01=2004 
Feb=01=2004 
Mar=01=2004 
Apr=01=2004 
May=01=2004 
相關問題