首页 > 解决方案 > 用于变量替换的 perl 正则表达式

问题描述

我想替换用“#”标记并以点或非字母数字字符结尾的变量。示例:变量#name 应替换为“Peter”

abc#name.def => abcPeterdef
abc#namedef => abc#namedef
abc#name-def => abcPeter-def

因此,如果变量以点结尾,则将其替换并删除该点。它是否由任何非字母字符终止,它也被替换。

我使用以下内容:

s/#name\./Peter/i
s/#name(\W)/Peter$1/i

这可行,但是否可以将其合并到一个表达式中?

标签: regexperl

解决方案


有几种可能的方法。

s/#name(\W)/"Peter" . ($1 eq "." ? "" : $1)/e

这里我们使用/e将替换部分转换为表达式,以便我们可以$1动态检查和选择替换字符串。

s/#name(?|\.()|([^.\w]))/Peter$1/

在这里,我们使用(?| )重置分支之间捕获组的编号,因此都设置\.()([^.\w])设置$1。如果 a.匹配,$1则成为空字符串;否则它包含匹配的字符。


推荐阅读