2012-06-27 169 views
3

在perl中有很多次,我想在匹配完成另一個替換操作符後用自己替換匹配的字符串。例如,我有一個應用程序,我需要查找帶引號的字符串並從中刪除空格。這樣做的一個方法是:正則表達式中的perl正則表達式

while($str =~ s/"([^"])+"//){ 
    $temp = $1; 
    $temp2 = $temp; 
    $temp =~ s/ /_/g; 
    $str =~ s/$temp2/$temp1/; 
} 

這也似乎是可能的:

$str =~ s/"([^"])+"/replace_spaces($1)/gx; 
sub replace_spaces(){ 
    $word = shift; 
    $word =~ s/ /_/g; 
    return $word; 
} 

是否有這樣做,通過正則表達式莫名其妙嵌套在一個正則表達式的正則表達式的純方式?

+1

是的,我知道這是在編程Perl的巨大的正則表達式章節中討論,但我不記得了。 – djechlin

回答

2

是的,你可以做到這一點,但在每種情況下,你需要創造新正則表達式。 在這種情況下沒有銀彈。

您必須使用下劃線而不是全部空格來更改空格,只能使用引號內的分隔子字符串。最後一個檢查條件是展望未來,然後看看後面的斷言,但這些檢查並不容易制定。

例如:

$ perl -pe 's/(?<=")(\S+)\s+(?=.*")/$1_/g;' 
a b "c d" e f 
a b "c_d" e f 

但這重新遠非完美。這在最簡單的情況下起作用。這不是一個解決方案,它只是這個想法的演示。

1

你可以嘗試:

$str =~ s{"([^"]+)"}{do{(local$_=$1)=~y/ /_/;$_}}eg; 

或者,爲了更好的可讀性:

$str =~ s/ 
      "([^"]+)"  # all inside double quotes to $1 
      /do{   # start a do block 
       local $_ = $1; # get a copy from $1 
       y| |_|;  # transliterate ' ' to '_' 
       $_    # return string from block 
       }   # end the do block 
      /xeg; 

問候

RBO