Perl:如果没有括号,正则表达式将不起作用

时间:2016-07-20 11:34:19

标签: regex perl

我在Perl中编写一个简单的脚本来检查字符串中是否有昵称的不同字形(英语和俄语)。我会使用下一个正则表达式:/(gunn?er|gunn?|ганн?еру?|ганн?у?)/i - 根据regex101.com test和Notepad ++,它是有效的。但是,在我的Perl计算机上,除非我将其他括号添加到?|/((gun(n)?er)|(gun(n)?)|(ган(н)?ер(у)?)|(ган(н)?(у)?)/i,否则此正则表达式不起作用。我的朋友,我已经问过这个,无法重现这种行为。是否应该更改脚本或Perl解释器本身的某种设置?

编辑:根据要求,我的测试代码:

#!/usr/bin/perl
my $GUN = "gunner";
my $HZ = "!!!";

sub GetNickFromMsg
{
    my ($msg) = @_;
    if ( $msg =~ /(gunn?er|gunn?|ганн?еру?|ганн?у?)/i )
    {
        return $GUN
    }
    return $HZ;
}

my @nicks = ("Gunner", "guner", "ганнер", "ганеру", "гану");
foreach $n (@nicks)
{
    my $res = GetNickFromMsg($n);
    print "$n -> $res\n");
}

我得到的输出:

Gunner -> !!!
guner -> !!!
ганнер -> !!!
ганеру -> !!!
гану -> !!!

如果我将正则表达式更改为第二个版本,并且括号到处都是,则每个字形的输出都应该是“ - > gunner”。我已尝试将use feature 'unicode_strings'添加到脚本的开头,并使用ui而不是卡西米尔所设想的i修饰符,但它没有帮助。

我使用Perl版本5.22.1

在Linux服务器Linux version 4.3.0-1-amd64 (debian-kernel@lists.debian.org) (gcc version 5.3.1 20160101 (Debian 5.3.1-5) ) #1 SMP Debian 4.3.3-5 (2016-01-04)上启动脚本

1 个答案:

答案 0 :(得分:4)

您需要在程序顶部添加use utf8,以指定您的程序代码使用UTF-8编码的字符

您还需要设置STDOUT来处理UTF-8编码,否则您将收到Wide character in print警告

这是您的程序的编辑版本,可以正常运行并提供您期望的行为

#!/usr/bin/perl

use utf8;
use strict;
use warnings 'all';

use open qw/ :std :encoding(UTF-8) /;

my $GUN = 'gunner';
my $HZ  = '!!!';

sub GetNickFromMsg {
    my ($msg) = @_;

    if ( $msg =~ /(gunn?er|gunn?|ганн?еру?|ганн?у?)/i ) {
        return $GUN;
    }

    return $HZ;
}

my @nicks = qw/ Gunner guner ганнер ганеру гану /;

foreach my $n (@nicks) {
    my $res = GetNickFromMsg($n);
    print "$n -> $res\n";
}

输出

Gunner -> gunner
guner -> gunner
ганнер -> gunner
ганеру -> gunner
гану -> gunner