簡體   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