[英]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.