如何在Perl中分割包含连字符的字符串

时间:2018-06-22 20:12:47

标签: regex perl split substr

我有一个称为($ date)的字符串,我试图使用Perl将其分为两部分。

$date= (June 25, 2018–July 1, 2018)

从我阅读的内容来看,将字符串分成两个单独的日期的正确方法似乎是创建一个新数组,使用带连字符的Perl split()函数作为分隔符,然后分配数组索引这样的StartDate / EndDate变量的值...

@dates = split(/-/, $date);
  $StartDate = @dates[0];
  $EndDate = @dates[1];

print "Effective Date: ($date)\n";
print "($StartDate)";
print "\n";
print "($EndDate)";

但是,这不符合我的预期。

请记住,上面的代码只是源代码的一小部分。

Current Output (Incorrect)

Effective Date: (June 25, 2018–July 1, 2018)
(June 25, 2018–July 1, 2018)
()

预期输出(正确)

Effective Date: (June 25, 2018–July 1, 2018)
(June 25, 2018)
(July 1, 2018)

正在寻找有关实现目标的建议。

1 个答案:

答案 0 :(得分:8)

这里的问题是您试图在-上进行拆分(U + 002D HYPHEN-MINUS),但您的字符串包含(U + 2013 EN DASH)。

有两种方法可以在正则表达式中指定此字符:

use utf8;
...
my ($StartDate, $EndDate) = split /–/, $date;

use utf8告诉perl您的源代码是UTF-8,因此您可以直接使用Unicode字符。

my ($StartDate, $EndDate) = split /\x{2013}/, $date;

或者您可以使用十六进制字符代码。

my ($StartDate, $EndDate) = split /\N{EN DASH}/, $date;

或命名的字符引用。

如果您不一定要拆分EN DASH,而是要使用任何破折号字符,则可以使用基于“ Dash”属性的字符类:

my ($StartDate, $EndDate) = split /\p{Dash}/, $date;

请注意,@dates[0]将触发警告(如果启用了use warnings,因为应该在Perl中将数组@foo的单个元素拼写为$foo[0] 。语法@array[ LIST ]用于数组切片,即按其索引提取多个元素。