使用拆分提取月份,日期,年份

时间:2012-12-17 15:25:45

标签: perl

我正在尝试从下面的字符串中提取日期,月份和年份。

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

5 个答案:

答案 0 :(得分:4)

您的split正则表达式[\s|,\s]是一个字符类(由[]括号表示),这意味着:“拆分为一个空格的单个字符,管道|,逗号或空格(再次)“。您将字符串Jan 01, 2004拆分为四个字符串:

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

你也拆分了$_变量,但我认为这是一个错字。

要解决您的问题,请将该行更改为:

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

正如您所看到的,使用+量词将删除多个连续的逗号或空格。

答案 1 :(得分:2)

你也可以这样做:split /,?\s/, $s;

答案 2 :(得分:1)

使用严格和警告,您会发现$s导致编译错误。

然后

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

我刚刚摆脱了[]括号,它运行良好。

答案 3 :(得分: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|,之一的角色类(这显然不是你的要)。

答案 4 :(得分: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