Perl:没有括号就不能使用正则表达式

阿尔塔鲁斯

我在Perl中编写了一个简单的脚本,以检查字符串中昵称的不同字形(英语和俄语)。我将使用下一个正则表达式:/(gunn?er|gunn?|ганн?еру?|ганн?у?)/i-根据regex101.com测试和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'到脚本的开头,并按Casimir的假设使用ui而不是i修饰符,但这没有帮助。

我在Linux version 4.3.0-1-amd64 ([email protected]) (gcc version 5.3.1 20160101 (Debian 5.3.1-5) ) #1 SMP Debian 4.3.3-5 (2016-01-04)带有Perl版本5.22.1的Linux服务器上启动脚本

鲍罗丁

您需要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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

没有“新”就不能使用我的“类型” ComplexNumber-为什么?

来自分类Dev

使用Perl正则表达式删除所有非尖括号单词

来自分类Dev

正则表达式使用正则表达式,但不能使用Visual Studio

来自分类Dev

如何使用正则表达式替换某些括号,但不能替换其他括号

来自分类Dev

如何使用正则表达式替换没有嵌套括号的字符串中不匹配的括号?

来自分类Dev

从HTML中删除具有特定类的范围,但不能使用正则表达式删除内容

来自分类Dev

正则表达式模式,允许任何ASCII字符。但不能使用空格

来自分类Dev

为什么我不能使用warnings.filterwarnings抑制正则表达式的警告

来自分类Dev

NSRegularExpression错误,我不能使用正则表达式

来自分类Dev

NSRegularExpression错误,我不能使用正则表达式

来自分类Dev

Perl在正则表达式中的花括号

来自分类Dev

正则表达式替换中的Perl尖括号

来自分类Dev

Perl正则表达式不包含圆括号

来自分类Dev

Perl在正则表达式中的花括号

来自分类Dev

有没有办法使用正则表达式多次匹配花括号内的特定模式?

来自分类Dev

有没有办法只将顶级括号与正则表达式匹配?

来自分类Dev

有没有办法只将顶级括号与正则表达式匹配?

来自分类Dev

Bash / Perl / Regex-正则表达式不能使用单行,但可以使用完整文件

来自分类Dev

为什么没有花括号就不能创建1语句函数?

来自分类Dev

在Perl中使用正则表达式从行中删除括号

来自分类Dev

为什么我的正则表达式白名单没有放在括号中?

来自分类Dev

匹配括号中没有的任何正则表达式

来自分类Dev

不抛出异常就不能使用Path(file)

来自分类Dev

正则表达式-括号内的所有内容

来自分类Dev

正则表达式和双括号有问题

来自分类Dev

大括号内的表达式的Perl正则表达式无法按预期工作

来自分类Dev

正则表达式可在终端中使用,但不能在Perl脚本中使用

来自分类Dev

使用括号的正则表达式模式

来自分类Dev

正则表达式使用哈希标签捕获括号?

Related 相关文章

  1. 1

    没有“新”就不能使用我的“类型” ComplexNumber-为什么?

  2. 2

    使用Perl正则表达式删除所有非尖括号单词

  3. 3

    正则表达式使用正则表达式,但不能使用Visual Studio

  4. 4

    如何使用正则表达式替换某些括号,但不能替换其他括号

  5. 5

    如何使用正则表达式替换没有嵌套括号的字符串中不匹配的括号?

  6. 6

    从HTML中删除具有特定类的范围,但不能使用正则表达式删除内容

  7. 7

    正则表达式模式,允许任何ASCII字符。但不能使用空格

  8. 8

    为什么我不能使用warnings.filterwarnings抑制正则表达式的警告

  9. 9

    NSRegularExpression错误,我不能使用正则表达式

  10. 10

    NSRegularExpression错误,我不能使用正则表达式

  11. 11

    Perl在正则表达式中的花括号

  12. 12

    正则表达式替换中的Perl尖括号

  13. 13

    Perl正则表达式不包含圆括号

  14. 14

    Perl在正则表达式中的花括号

  15. 15

    有没有办法使用正则表达式多次匹配花括号内的特定模式?

  16. 16

    有没有办法只将顶级括号与正则表达式匹配?

  17. 17

    有没有办法只将顶级括号与正则表达式匹配?

  18. 18

    Bash / Perl / Regex-正则表达式不能使用单行,但可以使用完整文件

  19. 19

    为什么没有花括号就不能创建1语句函数?

  20. 20

    在Perl中使用正则表达式从行中删除括号

  21. 21

    为什么我的正则表达式白名单没有放在括号中?

  22. 22

    匹配括号中没有的任何正则表达式

  23. 23

    不抛出异常就不能使用Path(file)

  24. 24

    正则表达式-括号内的所有内容

  25. 25

    正则表达式和双括号有问题

  26. 26

    大括号内的表达式的Perl正则表达式无法按预期工作

  27. 27

    正则表达式可在终端中使用,但不能在Perl脚本中使用

  28. 28

    使用括号的正则表达式模式

  29. 29

    正则表达式使用哈希标签捕获括号?

热门标签

归档