我正在使用Perl进行原型设计。
我需要一个表达式,用e
替换[ee]
,如果字符串恰好是2个字符,则由" e"完成。
le -> l [ee]
me -> m [ee]
elle -> elle : no change
我无法测试字符串的长度,我需要一个表达式来完成整个工作。
我试过了:
`s/(?=^.{0,2}\z).*e\z%/[ee]/g` but this is replacing the whole string
`s/^[c|d|j|l|m|n|s|t]e$/[ee]/g` same result (I listed the possible letters that could precede my "e")
`^(?<=[c|d|j|l|m|n|s|t])e$/[ee]/g` but I have no match, not sure I can use ^ on a positive look behind
修改 你真是太棒了,在网上搜索了几个小时,我在这里发布了几分钟的答案。
我尝试了所有你的解决方案,他们在我的脚本中直接工作,即这一个:
my $test2="le";
$test2=~ s/^(\S)e$/\1\[ee\]/g;
print "test2:".$test2."\n";
-> test2:l[ee]
但是我从一个文本文件加载这些正则表达式(使用Perl for proto,想法是将它重用于任何实现正则表达式的语言):
在我存储的文本文件中(我使用%来分割匹配和替换之间的行):
^(\S)e$% \1\[ee\]
然后我解析并应用所有正则表达式:
my $test="le";
while (my $row = <$fh>) {
chomp $row;
if( $row =~ /%/){
my @reg = split /%/, $row;
#if no replacement, put empty string
if($#reg == 0){
push(@reg,"");
}
print "reg found, reg:".$reg[0].", replace:".$reg[1]."\n";
push @regs, [ @reg ];
}
}
print "orgine:".$test."\n";
for my $i (0 .. $#regs){
my $p=$regs[$i][0];
my $r=$regs[$i][1];
$test=~ s/$p/$r/g;
}
print "final:".$test."\n";
这种技术在我的其他正则表达式中运行良好,但是当我在替换中有1美元或1时......这就是我所获得的:
final:\1\ee\
PS:你回答了最初的问题,我应该打开另一个帖子吗?
答案 0 :(得分:2)
像s/(?i)^([a-z])e$/$1[ee]/
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以使用以下匹配2个字符的正则表达式,然后您可以将其替换为$1\[$2$2\]
:
^([a-zA-Z])([a-zA-Z])$
演示:
$my_string =~ s/^([a-zA-Z])([a-zA-Z])$/$1[$2$2]/;
答案 3 :(得分:1)
为什么您没有使用捕获组进行替换?
`s/^([c|d|j|l|m|n|s|t])e$/\1 [ee]/g`
如果这些是您需要的字符,并且如果它确实是一行中没有空格的一行,那么这将有效。
这是另一种选择,具体取决于您的需求。它将匹配由一个a-z字符组成的两个字符串,后跟一个&#39; e&#39;在它自己的行之前或之后可能有空格。它将替换为单个a-z字符后跟&#39; [EE]&#39;
`s/^\s*([a-z])e\s*$/\1 [ee]/`
答案 4 :(得分:1)
我会做这样的事情
$word =~ s/^(\w{1})(e)$/$1$2e/;