[英]perl regex for variable substitution
我想替换以“#”标记并以点或非字母数字字符结尾的变量。 示例:应将变量#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
这可行,但是可以将其合并为一个表达式吗?
有几种可能的方法。
s/#name(\W)/"Peter" . ($1 eq "." ? "" : $1)/e
在这里,我们使用/e
将替换部分转换为表达式,因此我们可以检查$1
并动态选择替换字符串。
s/#name(?|\.()|([^.\w]))/Peter$1/
在这里,我们使用(?|
)
重置分支之间捕获组的编号,因此\\.()
和([^.\\w])
设置$1
。 如果一个.
匹配后, $1
变为空字符串; 否则包含匹配的字符。
您可以使用
s/#name(?|\.()|(\W))/Peter$1/i
细节
#name
匹配文字子串 (?|\\.()|(\\W))
-与两个选项之一匹配的分支重置组 :
\\.()
-一个点,然后将一个空字符串捕获到$1
|
- 要么 (\\W)
-捕获到$1
任何非单词char。 因此,在匹配时, $1
占位符为空或包含除点以外的任何非单词char。
您可以通过使用文字点或单词边界作为终止符来执行此操作
像这样
s/#name(?:\.|\b)/Peter/i
这是一个完整的程序,可以再现问题中显示的所需输出
use strict;
use warnings 'all';
for my $s ( 'abc#name.def', 'abc#namedef', 'abc#name-def' ) {
( my $s2 = $s ) =~ s/#name(?:\.|\b)/Peter/i;
printf "%-12s => %-s\n", $s, $s2;
}
abc#name.def => abcPeterdef
abc#namedef => abc#namedef
abc#name-def => abcPeter-def
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.