[英]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
,它不會除去d
或l
或r
從結果。
第三件事[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.