如何解决Perl:替换捕获组
我最近了解了 Perl 捕获组。我想在 C++ 源代码中查找特定的文本行并替换该行中的数值。
我正在寻找的行如下:
outf << EPS << "\t" << TOL << "\t" << ort << "\t" << bkw << "\t" << gflops << "\t# 99-99" << endl;
我想替换的数值是99-99
。我想用由两个数字组成的类似结构替换它,例如6-8
、6-16
等
我用来查找特定行和数字结构的正则表达式是:
$txt =~ /outf.*\\t\# (\d+-\d+).*<< endl;/;
数字结构用组正确捕获,并将存储在 $1
中。 $txt
是一个字符串变量,包含整个 C++ 文件的源代码。
我改变了正则表达式,试图将匹配的组替换为:
$txt =~ s/outf.*\\t\# (\d+-\d+).*<< endl;/$eb-$mb/;
但它用存储在变量 $eb
和 $mb
中的新数字结构替换整行。有没有一种优雅的方法来替换捕获的组仅 (\d+-\d+)
?
更新:反对意见,法官大人,我反对我的问题被关闭。首先,它有一个更清晰的问题和一个最小的工作示例。其次,similar question 中提供的答案既不雅观又繁琐。第三,Perl 因能够以多种不同方式解决同一问题而臭名昭著。我相信这里提供的答案更合适、更清晰。
解决方法
如果您的 Perl 足够新(5.10+),您可以使用环视。
s/outf.*\\t\# \K\d+-\d+(?=.*<< endl;)/$eb-$mb/;
# ~~ ~~
-
\K
表示“匹配到这里但忘记匹配的内容”,因此匹配字符串的开头,但不会替换。 -
(?=...)
表示“后跟 ...”,其中该部分再次匹配但未被替换。有关详细信息,请参阅 perlre。
请注意,您现在根本不需要任何捕获。
,试试
$txt =~ s/(outf.*\\t\# )(\d+-\d+)(.*<< endl);/$1$eb-$mb$3/
这会为您提供三个匹配的组并仅替换第二个。因此,您捕获的组不再是 1 美元,而是 2 美元。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。