如何在perl中拆分包含连字符的字符串

Dew*_*wBe 1 regex perl split substr

我有一个字符串称为($ date)我试图使用Perl分成两部分.

$date= (June 25, 2018–July 1, 2018)
Run Code Online (Sandbox Code Playgroud)

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

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

print "Effective Date: ($date)\n";
print "($StartDate)";
print "\n";
print "($EndDate)";
Run Code Online (Sandbox Code Playgroud)

然而,这并不像我预期的那样有效.

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

Current Output (Incorrect)

Effective Date: (June 25, 2018–July 1, 2018)
(June 25, 2018–July 1, 2018)
()
Run Code Online (Sandbox Code Playgroud)

预期输出(正确)

Effective Date: (June 25, 2018–July 1, 2018)
(June 25, 2018)
(July 1, 2018)
Run Code Online (Sandbox Code Playgroud)

寻找有关如何实现目标的任何建议.

mel*_*ene 8

这里的问题是你试图拆分-(U + 002D HYPHEN-MINUS),但你的字符串包含(U + 2013 EN DASH).

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

use utf8;
...
my ($StartDate, $EndDate) = split /–/, $date;
Run Code Online (Sandbox Code Playgroud)

use utf8 告诉perl你的源代码是UTF-8,所以你可以按字面意思使用Unicode字符.

my ($StartDate, $EndDate) = split /\x{2013}/, $date;
Run Code Online (Sandbox Code Playgroud)

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

my ($StartDate, $EndDate) = split /\N{EN DASH}/, $date;
Run Code Online (Sandbox Code Playgroud)

或者命名的字符引用.

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

my ($StartDate, $EndDate) = split /\p{Dash}/, $date;
Run Code Online (Sandbox Code Playgroud)

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