2012-12-17 39 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 
相关问题