【问题标题】:Word capture failing wrong on unicode, how to fix for 5.10unicode 上的 Word 捕获失败,如何修复 5.10
【发布时间】:2013-01-30 22:33:41
【问题描述】:

我有这个正则表达式。

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( $_ ) 并不能解决问题。

【问题讨论】:

  • Afaik \w 应该匹配 5.10 中的 unicode 字符。确保你的字符串被正确编码并且 Perl 知道它是 unicode 格式。

标签: regex perl unicode


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 确实如此,正如您在我在更新中添加的测试中看到的那样。
    • 我不知道,当我昨晚尝试添加它时,它在我的代码块中不起作用。
    • 除非您向我展示问题的演示,否则我无法告诉您原因。
    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2021-03-20
    相关资源
    最近更新 更多