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

标签 regex perl

情况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/

相关文章:

Net::OpenSSH 模块上的 Perl SSH 连接错误

regex - 在 perl 中搜索和用普通破折号替换小数破折号的正则表达式?

javascript - 正确编写 JavaScript 正则表达式来分割字符串

c# - 用于 URL 验证的正则表达式

perl - 在 Perl 脚本中处理命令行参数的正确方法是什么?

perl - 当 Perl 脚本的 $0 变为空时有什么标准吗?

javascript - 如何检查一个字符串是否在另一个字符串内(但不在边缘)?

Ruby 扫描标签,除非被 unescaped\

javascript 替换为具有特定 id 的正则表达式 img 标记,但其他属性可以是任何内容

perl - 如何在 Perl 中将列表作为数组引用返回?