簡體   English   中英

Perl正則表達式用於變量替換

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM