假设我想在每个单词后删除一个空格。实际上,空格前的正则表达式更为复杂。
$text =~ s/(\w+) /$1/g;
Run Code Online (Sandbox Code Playgroud)
按预期工作,但我不喜欢需要$1,因为匹配某些内容,将其删除并再次插入似乎效率不高。我尝试了积极的前瞻,但这不起作用:
$text =~ s/(?=\w+) //g;
Run Code Online (Sandbox Code Playgroud)
我知道它不起作用,因为“位置”不会随着这种前瞻而改变。有没有另一种方法可以摆脱$1?
s///不会修改原始字符串,而是构建一个新字符串,因此无论如何它都会复制前缀。[1]捕获本身可以减慢速度,但我认为这已经得到改进。也就是说,\K正是你想要的。
$text =~ s/\w\K //g;
Run Code Online (Sandbox Code Playgroud)
您可以看到原始标量在每次替换完成之前都不会改变:
$text =~ s/\w\K //g;
Run Code Online (Sandbox Code Playgroud)