perl正则表达式替换特定的字符串长度

时间:2015-07-14 19:34:22

标签: regex string perl

我正在使用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:你回答了最初的问题,我应该打开另一个帖子吗?

5 个答案:

答案 0 :(得分:2)

s/(?i)^([a-z])e$/$1[ee]/

这样的东西

答案 1 :(得分:1)

^(\S)e$

试试这个。$1 [ee]。见。演示。

https://regex101.com/r/hR7tH4/28

答案 2 :(得分:1)

您可以使用以下匹配2个字符的正则表达式,然后您可以将其替换为$1\[$2$2\]

^([a-zA-Z])([a-zA-Z])$

演示:

$my_string =~ s/^([a-zA-Z])([a-zA-Z])$/$1[$2$2]/;

请参阅演示https://regex101.com/r/iD9oN4/1

答案 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/;