我正在尝试从下面的字符串中提取日期,月份和年份。
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
答案 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