2010-08-01 22 views
1

我以前的帖子得到了部分剝離的標籤,所以這裏要再次重申:的Perl:標籤分隔的字符串內全球substition

我的目標是取代尾隨的所有實例 - 一個尾隨+標籤括號內。讓我們假設要被替換的行看起來是這樣的:

<h> aa- aa- </h> <h> ba- ba- </h> 

,應該事後看起來像

<h> aa+ aa+ </h> <h> ba+ ba+ </h>. 

首先我嘗試這樣表達:

s/<h>(.*?)-(.*?)<\/h>/<h>$1+$2<\/h>/g; 

其產生這樣的輸出:

<h> aa+ aa- </h> <h> ba+ ba- </h>. 

T他的g選項會導致每行有多個替換,但僅限於每個標記支架的第一個實例(並且僅當兩個圓括號中包含問號時)。

爲了縮小這個問題,我然後試圖實現不考慮標籤的替換。表達

s/(.*?)-(.*?)/$1+$2/g; 

確實導致所需結果

<h> aa+ aa+ </h> <h> ba+ ba+ </h>. 

這將替換標記括號的外面,以及,當然。

那麼,我的第一個表達式有什麼問題,我如何實現我在標籤括號內完全替換的目標?

+0

如果您實際上沒有新問題,請不要發佈新問題,請編輯您的原始問題。你應該刪除這個新問題。 – Gilles 2010-08-01 12:27:04

回答

0

1)克選項可用於整個正則表達式incuding標籤

2)使用兩次或直到沒有變化

0

獨立的標籤選擇和替代操作:

$str = '<h> aa- aa- </h> <h> ba- ba- </h>'; 
while ($str =~ m!<h>.*?-.*?</h>!) { 
    substr($str, $-[0], $+[0] - $-[0]) =~ y/-/+/; 
} 
print $str, "\n"; 

@-@+陣列提供關於上次成功匹配的偏移信息。)

或者:

sub fixup_h_tag { 
    my $tag = shift; 
    $tag =~ y/-/+/; 
    $tag 
} 
$str = '<h> aa- aa- </h> <h> ba- ba- </h>'; 
$str =~ s{ (<h>.*?</h>) }{ fixup_h_tag("$1") }gxe; 
print $str, "\n"; 

請注意,如果你的代碼標記語言允許評論或某種引號的字符串(可能含有或不作爲標記)或可選的空白或在H標籤屬性,正則表達式是不容易要提供一個強大的解。