2013-10-30 62 views
2

我想在某個匹配之前或之後的特定模式不匹配的基礎上,在perl上執行全局替換。基本上,我有一個xml標籤,並希望在標籤之前或之後的十個字符內發生匹配時保留它,但如果不是,則刪除xml標籤。Perl全局替換展望未來?

所以,如果我有一個字符串,其中包含:

foo something<xml tag>bar<\xml tag> something 

,也不會發生替代,但如果字符串是

something <xml tag>bar<\xml tag> something 

它會被替換成:

something bar something 

我試過的是:

$string =~ s/(?<!foo.{0,10})<xml tag>(bar)<\/xml tag> |<xml tag>(bar)<\/xml tag>(?!.{0,10}foo)/$1/g; 

但我得到這個錯誤:

Variable length lookbehind not implemented in regex 

我真的不知道如何做到這一點。幫幫我?

+3

在正則表達式查找屁股必須被固定長度:http://stackoverflow.com/questions/3796436/whats-該技術的原因的換回顧後斷言,必須待確定的長度在-R – Martyn

回答

0

perlretut

Lookahead "(?=regexp)" can match arbitrary regexps, but lookbehind "(?<=fixed-regexp)" only works for regexps of fixed width, i.e., a fixed number of characters long. Thus "(?<=(ab|bc))" is fine, but "(?<=(ab)*)" is not.

因此,如果字(S)已<xml tag>bar<\xml tag>之前固定長度你應該使用它,否則,你可以使用一個以上的正則表達式爲例。使用e標誌

0

一種方式:

while (<DATA>) { 
    s/((.{0,13})<xml\ tag>([^<]*)<\/xml\ tag>)(?!.{0,10}foo)/ 
    index($2,'foo') > -1 ? "$1" : "$2$3"/xe; 
    print $_; 
} 

__DATA__ 
foo something<xml tag>bar</xml tag> something 
something <xml tag>bar</xml tag> something 

產地:

foo something<xml tag>bar</xml tag> something 
something bar something