[英]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.