Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Perl中的一个正则表达式中存在两个字符串时替换字符串大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
鉴于以下输入
$cat pre
stuff MACRO1 stuff MACRO2
stuff MACRO2 stuff MACRO1
stuff MACRO2 stuff

如果MACRO1也存在,我想替换MACRO2(与MACRO3).像这样:

$perl -ne '/(?=.*MACRO1).*MACRO2/ ? print s/MACRO2/MACRO3/gr : print' pre
stuff MACRO1 stuff MACRO3
stuff MACRO3 stuff MACRO1
stuff MACRO2 stuff

(我想这个表达式的.* MACRO2部分是不必要的,现在我虑一下)
编辑.到目前为止,基于反馈的上述不太愚蠢的版本:

$perl -ne '/MACRO1/ ? print s/MACRO2/MACRO3/gr : print' pre

我想弄清楚的是如何只使用正则表达式来做到这一点.这是一次尝试:

$perl -ne 'print s/(?=.*MACRO1)(?=.*MACRO2)MACRO2/MACRO3/gr' pre
stuff MACRO1 stuff MACRO2
stuff MACRO3 stuff MACRO1
stuff MACRO2 stuff

我认为我对前瞻运算符如何同时成为“锚”和“非消费”都有一些根本的困惑.如果我虑?=作为一个锚点,我认为上述方法不起作用.但这似乎与“非消费”相矛盾.

任何人都可以定义非消费的含义,并向我展示一个可以产生预期结果的正则表达式吗?

解决方法

首先,让我们得到实际的解决方案:
perl -pe's/MACRO2/MACRO3/g if /MACRO1/'

现在,让我们看看你的特殊要求.作为单个替换,它看起来如下所示:

perl -pe's/MACRO2(?:(?<=MACRO1.*)|(?=.*MACRO1))/MACRO3/g'

忽略这不起作用的事实,因为不支持可变宽度的lookbehinds,这是非常低效的.然我提出的第一个解决方案所需的时间受文件大小的限制,但此解决方案所需的时间受文件大小的因子乘以MACRO2实例数的因子!

大佬总结

以上是大佬教程为你收集整理的在Perl中的一个正则表达式中存在两个字符串时替换字符串全部内容,希望文章能够帮你解决在Perl中的一个正则表达式中存在两个字符串时替换字符串所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。