如何用动态字符串替换字符串

时间:2014-09-04 13:20:19

标签: regex perl

案例1。

我有一串字母,如fthhdtrhththjgyhjdtygbh。使用正则表达式我想将其更改为ftxxxxxxxxxxxxxxxxxxxxx,即保留前两个字母并用x替换其余字母。

经过大量的谷歌搜索,我实现了这个目标:

s/^(\w\w)(\w+)/$1 . "x" x length($2)/e;

案例2。

我有一串字母,如sdsABCDEABCDEABCDEABCDEABCDEsdf。使用正则表达式我想将其更改为sdsABCDExyxyxyABCDEsdf,即保留第一个和最后一个ABCDE并用xy替换中间的ABCDE。 我实现了这个目标:

s/ABCDE((ABCDE)+)ABCDE/$len = length($1)\/5; ABCDE."xy"x $len . ABCDE/e;

问题:我对上述问题的解决方案不满意。对于上述问题,是否有更好或更好的解决方案。

约束:只需使用一个正则表达式。

对于标题和问题正文中的英语不好,抱歉,英语不是我的第一语言。如果有任何不明确的地方,请在评论中提问。

2 个答案:

答案 0 :(得分:1)

使用\1引用第一个捕获组的一个正则表达式,更少的冗余,

s|(ABCDE)\K (\1+) (?=\1)| "xy" x (length($2)/length($1)) |xe;

答案 1 :(得分:1)

任务1:简化密码隐藏正则表达式

使用Positive Lookbehind Assertion替换前面有两个其他单词字符的所有单词字符。这消除了对/e Modifier

的需求
my $str = 'fthhdtrhththjgyhjdtygbh';

$str =~ s/(?<=\w{2})\w/x/g;

print $str;

输出:

ftxxxxxxxxxxxxxxxxxxxxx

任务2:翻译内部重复模式正则表达式

同时使用Positive Lookbehind和Lookahead Assertion来替换由相同字符串预订的所有ABCDE

my $str = 'sdsABCDEABCDEABCDEABCDEABCDEsdf';

$str =~ s/(?<=(ABCDE))\1(?=\1)/xy/g;

print $str, "\n";

输出:

sdsABCDExyxyxyABCDEsdf