我在这件事上研究了很多之后,来请求你的帮助:
我试图限制 Perl 正则表达式对大文本所做的替换的重复。
我在谷歌搜索过,发现格式是 {2,3} (min, max) 但这似乎是我使用的语法的不同方式。
$replaced=~s/$var/$var2/g; # replaces all ocurrences
$replaced=~s/$var/$var2/; # replaces only first one
我的非最佳解决方案:
for($i=0; $i<8; $i++){
$replaced=~s/$var/$var2/;
}
我尝试过的:
$replaced=~s/$var/$var2/{8};
$replaced=~s/$var/$var2{8}/;
任何帮助将不胜感激!
编辑:
好的,所以几乎必须涉及一个循环,嗯.. 没有内置参数来限制它,这不是很奇怪吗??
最佳答案
\G
的答案可能是做你想做的最实用的方法,但只是为了好玩或教育或其他什么,这是另一种方式(需要 perl 5.10 或更高版本),使用代码断言和 backtracking control verbs (*COMMIT)
和 (*FAIL)
:
my $str = "Bananas in pajamas are coming down the stairs";
my $limit = 3;
my $count;
$str =~ s/(*COMMIT)(?(?{ $count++ >= 3 })(*FAIL))a/A/g;
say $str;
在
$str
中留下文本“睡衣中的 BAnAnAs 正在下楼梯”——只有前三个“a”受到影响,并且在第三个之后它停止扫描字符串以获取更多匹配项。