Perl:替换捕获的组

我最近了解了 Perl 捕获组。我想在 C++ 源代码中查找特定的文本行并替换该行中的数值。

我正在寻找的线路如下:

outf << EPS << "t" << TOL << "t" << ort << "t" << bkw << "t" << gflops << "t# 99-99" << endl;

我要替换的数值是99-99. 我想用由两个数字组成的类似结构替换它,例如6-86-16等等。

我用来查找此特定行和数字结构的正则表达式是:

$txt =~ /outf.*t# (d+-d+).*<< endl;/;

数字结构用组正确捕获,并将存储在$1. 的$txt是包含整个C ++文件的源代码的字符串变量。

我改变了正则表达式,试图将匹配的组替换为:

$txt =~ s/outf.*t# (d+-d+).*<< endl;/$eb-$mb/;

但它用存储在变量$eb和 中的新数字结构替换了整行$mb。有没有一种优雅的方法来仅替换捕获的组(d+-d+)

更新:反对,法官大人,我反对关闭我的问题。首先,它有一个更清晰的问题和一个最小的工作示例。其次,类似问题提供的答案既不雅观又繁琐。第三,Perl 因能够以多种不同方式解决同一问题而臭名昭著。我相信这里提供的答案更合适和清晰。

回答

如果您的 Perl 足够新(5.10+),您可以使用环视。

s/outf.*t# Kd+-d+(?=.*<< endl;)/$eb-$mb/;
#             ~~        ~~
  • K 意思是“匹配到这里但忘记你匹配了什么”,所以字符串的开头被匹配,但不会被替换。
  • (?=...)意思是“紧随其后……”,其中零件再次匹配但未被替换。有关详细信息,请参阅perlre。

请注意,您现在根本不需要任何捕获。


以上是Perl:替换捕获的组的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>