繁体   English   中英

为什么这个 perl 正则表达式不起作用?

[英]Why is this perl regex not working?

我有这个数组。

my @input = ("He walk+V3SG very fast.", "He study+V3SG hard.");

我想将“walk+V3SG”和“study+V3SG”替换为“walks”和“studies”。

下面是我写的脚本。 我认为这应该有效,但由于某种原因它不起作用。

    foreach my $sent(@input){
    if ($sent =~ m/\Q+V3SG/){
        if ($sent =~ m/\Q[dlr]y+V3SG/){
            $sent =~ s/\Q[dlr]y+V3SG/ies/g;
        }
        if ($sent =~ m/\Q[s|x|sh|ch|o]+V3SG/){
            $sent =~ s/\Q[s|x|sh|ch|o]+V3SG/es/g;
        }
        else {$sent =~ s/\Q+V3SG/s/g}
    }
}

foreach my $sent(@input){
    print $sent;
    print "\n";
}

谁能告诉我脚本有什么问题?

\\Q使正则表达式的其余部分逐字匹配[dlr]y+V3SG 移动它可以使字符类正常运行:

s/[dlr]\Qy+V3SG/ies/g

或者只是逃避+

s/[dlr]y\+V3SG/ies/g

在此更改后,您将获得,例如:

He stuies hard.

要确保保留第一个字母,您可以使用捕获或\\K (自 5.10 起):

s/[dlr]\K\Qy+V3SG/ies/g

对于第二个正则表达式,您使用了错误的括号:

s/(s|x|sh|ch|o)\Q+V3SG/$1es/g

您应该将\\Q保留在文字之前。 您将它放在整个正则表达式之前,因此整个正则表达式被视为文字而不被解释。

第二件事你应该明智地使用\\K来替代。 将它放在您不想替换的部分之后。 为例如: s/[dlr]\\Ky\\Q+V3SG/ies/g使得study studies ,它不会除去dlr从结果。

第三件事[s|x|sh|ch|o]不会按照你的想法去做。 它将匹配s,x,h,|,c,o中的任何字符。 正确的应该是(?:s|x|sh|ch|o) (?:...)用于非捕获组。

最后,这根本不应该是 if/elsif/else。 句子可以包含所有三种形式。

总的来说:它给了我们:

#!/usr/bin/perl
use strict;
use warnings;

my @input = ("He walk+V3SG very fast.", "He study+V3SG hard.","He crush+V3SG hard.");

foreach (@input){
    if (m/\Q+V3SG/){
        s/[dlr]\Ky\Q+V3SG/ies/g;
        s/(?:s|x|sh|ch|o)\K\Q+V3SG/es/g;
        s/\Q+V3SG/s/g;
    }
}

foreach my $sent(@input){
    print $sent;
    print "\n";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM