Regex 是否可以使用单个s//指定迭代替换过程?

Regex 是否可以使用单个s//指定迭代替换过程?,regex,perl,Regex,Perl,假设我们要用000替换1的每个实例,该实例出现在既不是0也不是1的第一个字符之前 例如,如果原始字符串为 "0011101TUVW0123ABC0123" 然后,所需的替换将产生字符串 "000000000000000TUVW0123ABC0123" 在Perl 5中,假设$\uu保存输入字符串,那么类似这样的操作将实现以下目的: “*您喜欢的任意*常量!”而s/^(0*)1/${1}000/ 此方法只是不断应用相同的替换规则(s/^(0*)1/${1}000/),直到它“收敛”(即停止更改

假设我们要用
000
替换
1
的每个实例,该实例出现在既不是
0也不是
1
的第一个字符之前

例如,如果原始字符串为

"0011101TUVW0123ABC0123"
然后,所需的替换将产生字符串

"000000000000000TUVW0123ABC0123"
在Perl 5中,假设
$\uu
保存输入字符串,那么类似这样的操作将实现以下目的:

“*您喜欢的任意*常量!”而s/^(0*)1/${1}000/

此方法只是不断应用相同的替换规则(
s/^(0*)1/${1}000/
),直到它“收敛”(即停止更改输入)

我想知道是否有一个
s//
子条件使得它的一个应用程序可以获得相同的结果。(想想看,
s/1/000/g
的单个应用程序能够用
000
替换每次出现的
1


请注意,
s/^(0*)1/${1}000/g
的单个应用程序将仅替换第一次出现的
1
,导致:

"000001101TUVW0123ABC0123"

使用与字符串开头或上一次匹配后的位置相匹配的
\G
锚定:

echo "0011101TUVW0123ABC0123" | perl -pe 's/\G0*\K1/000/g'
更新 我现在意识到OP可能需要一个在PCRE范围内的解决方案,而提到Perl 5只是一个转移视线的问题。然而,我将这个解决方案留在原地,以防其他人带着类似的问题来到这里,但没有这样的限制


最简单的方法是使用一个可执行替换,在0和1的初始序列上执行转换

像这样。
/r
修饰符(无损替换)至少需要5.14版本的Perl

use strict;
use warnings 'all';
use v5.14;

my $s = "0011101TUVW0123ABC0123";

$s =~ s{^([01]+)}{ $1 =~ s/1/000/gr }e;

say $s;
输出
我忘记了
\G
,直到现在才知道
\K
。两者都很棒。谢谢我不知道或
/r
;我可以看到它的许多用途;感谢您指出这一点。Perl regex!=PCRE。你能澄清一下你要找的是哪一个吗?@ThisSuitesBlacknot:好的,我相信你的话“Perl regex!=PCRE”;我已经删除了所有提到“PCRE”的帖子。
000000000000000TUVW0123ABC0123