在正则表达式匹配后删除文本的有效方法

And*_*dré 3 regex perl

假设我想在每个单词后删除一个空格。实际上,空格前的正则表达式更为复杂。

$text =~ s/(\w+) /$1/g;
Run Code Online (Sandbox Code Playgroud)

按预期工作,但我不喜欢需要$1,因为匹配某些内容,将其删除并再次插入似乎效率不高。我尝试了积极的前瞻,但这不起作用:

$text =~ s/(?=\w+) //g;
Run Code Online (Sandbox Code Playgroud)

我知道它不起作用,因为“位置”不会随着这种前瞻而改变。有没有另一种方法可以摆脱$1

ike*_*ami 9

s///不会修改原始字符串,而是构建一个新字符串,因此无论如何它都会复制前缀。[1]捕获本身可以减慢速度,但我认为这已经得到改进。也就是说,\K正是你想要的。

$text =~ s/\w\K //g;
Run Code Online (Sandbox Code Playgroud)
  1. 您可以看到原始标量在每次替换完成之前都不会改变:

    $text =~ s/\w\K //g;
    
    Run Code Online (Sandbox Code Playgroud)

  • 精彩答案+1 (2认同)