情况1。
我有一串字母 喜欢 fthhdtrhththjgyhjdtygbh
.使用正则表达式我想把它改成 ftxxxxxxxxxxxxxxxxxxxxx
,即保留前两个字母并将其余字母替换为 x。
经过大量的谷歌搜索,我实现了这一点:
s/^(\w\w)(\w+)/$1 . "x" x length($2)/e;
案例 2。
我有一串字母 喜欢
sdsABCDEABCDEABCDEABCDEABCDEsdf
.使用正则表达式我想把它改成 sdsABCDExyxyxyABCDEsdf
,即保留第一个和最后一个 ABCDE
并将中间的 ABCDE 替换为 xy
.我做到了:
s/ABCDE((ABCDE)+)ABCDE/$len = length($1)\/5; ABCDE."xy"x $len . ABCDE/e;
问题 :我对上述问题的解决方案不满意。是否有更好或巧妙的解决方案来解决上述问题。
约束 : 只需要使用一个正则表达式。
很抱歉标题和问题正文中的英语很差,英语不是我的第一语言。如果有什么不清楚的,请在评论中提问。
最佳答案
任务 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
关于regex - 如何用动态字符串替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666607/