2

我有这个正则表达式。

my ( $word ) = $_ =~ /(\w{2,})/xms;

它无法正确捕获具有 unicode 的单词。我能够修复它

my ( $word ) = $_ =~ /(\w{2,})/uxms;

但该/u功能仅在 5.14 中可用。无论如何我可以使单词在 5.10 中匹配吗?

完整代码在这里:Dist::Zilla::Plugin::Test::PodSpelling

添加一些鲤鱼(正则表达式之前和之后)

Simões at /home/ccushing/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/x86_64-linux/Class/MOP/Method/Wrapped.pm line 162.
Sim at /home/ccushing/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/x86_64-linux/Class/MOP/Method/Wrapped.pm line 162.

还注意到只需添加use 5.014到文件顶部即可解决问题。在正则表达式之前添加utf8::upgrade( $_ )并不能解决问题。

4

2 回答 2

3

使用\p{Word}而不是\w. \w可能有也可能没有 unicode 语义(取决于一些复杂的规则),但\p总是有。

于 2013-02-15T02:02:45.813 回答
1

use feature qw( unicode_strings );将在某些版本中发挥作用。utf8::upgrade($_);在比赛之前将在所有版本中发挥作用。

测试:

use open ':std', ':utf8';
$_ = "Sim\xF5es";
print $_ =~ /(\w{2,})/xms, "\n";
utf8::upgrade($_);
print $_ =~ /(\w{2,})/xms, "\n";

输出:

Sim
Simões
于 2013-02-15T06:44:44.513 回答