2011-10-05 56 views
2

我有一個字符串perl的模式匹配一​​一併處理它

[something]text1[/something] blah blah [something]text2[/something] 

我需要寫一個Perl腳本讀什麼是在[something]標籤,並處理爲「text-X」,並把它返回一個[otherthing]標籤。所以上面的字符串應該是

[otherthing]text-1[/otherthing] blah blah [otherthing]text-2[/otherthing] 

將「textx」處理爲「text-x」不是一步處理。

所以這是解決方案,我至今:

m/[something](?<text>.*)[/something]/ 

這將讓我在字符串之間,我可以處理爲「text-X」,但我怎麼把它放回在同一與[otherthing]text-x[/otherthing]

  1. 如何在這種情況下使用s ///?
  2. 如何爲整個字符串做一個一個?
+1

該正則表達式不起作用,因爲'[',']'和'/'是未轉義的元字符。 – TLP

回答

2

您可以使用/e開關s///來評估右側,然後使用結果作爲替代,並使用/g標誌對每個匹配執行此操作。

下面是一個簡單的例子:

use 5.12.0; 

my $str = ">1< >2< >34<"; 

$str =~ s/>(\d+)</">>".process("$1")."<<"/eg; 

say $str; 

sub process { 
    return "x" x $_[0]; 
} 
0

在這種特殊情況下,你就可以完成你想做什麼通過分割上"[something]"的字符串,然後處理每一塊的開始(除了第一個),然後加入碎片重新走到一起的時候,你'重做。

我不知道是否有一種通用的方法來遍歷Perl中的字符串中的正則表達式匹配。我希望別人會回答這個問題,並教育我。

1

這應該接近。它使用/ e修飾符允許您在正則表達式的替換側執行處理,因此它調用了可以執行多個步驟的fix_textx函數。

迭代匹配的正常方式是使用/ g修飾符。

#!/usr/bin/perl 
use strict; 
use warnings; 

my $string = '[something]text1[/something] blah blah [something]text2[/something]'; 

$string =~ s{\[something\](text[^[]*)\[\/something\]} 
      {'[otherthing]' . fix_textx($1) . '[/otherthing]'}ge; 

print $string; 

sub fix_textx { 
    my ($testx) = @_; 
    $testx =~ s/text\K(.*)/-$1/; 
    return $testx; 
} 

編輯:固定方括號。謝謝@tadmc

+0

你的char類中的方括號面對着錯誤的方式,它應該是(text [^ [] *)。 – tadmc