2012-11-06 54 views
1

使用regsub可以在表達式中做不同的替換嗎?有沒有辦法使用REGSUB做多個替代?

例如:

set a ".a/b.c..d/e/f//g" 

現在,在該表達式中,是有可能替代 「.」 爲 「yes」 「..」 爲 「no」 「/」 爲 「true」 「 //「作爲」false「在單個regsub命令?

回答

8

With a regsub,no。對於這類事情有一個長期的功能要求(它需要用對比賽信息評估一個命令的結果進行替換),但是它迄今還沒有被採取行動。

但是你可以用string map做你在這種情況下,想要的東西:

set a ".a/b.c..d/e/f//g" 
set b [string map {".." "no" "." "yes" "//" "false" "/" "true"} $a] 
puts "changed $a to $b" 
# changed .a/b.c..d/e/f//g to yesatruebyescnodtrueetrueffalseg 

注意構建地圖時,如果有從價值是另一個的前綴,較長的距離值應該是先放。 (這是因爲string map實現檢查其更改爲了讓你列出他們...)


它可以使用regsubsubst做多目標替代的兩步過程,但我除非是非常複雜的情況,否則不要建議它!一個不錯的string map更容易處理。

+0

缺少的功能相當於Perl的/// e'。這種情況下的總體矯枉過正... –

2

你也可以嘗試自己做。這是一份草稿proc,您可以將其作爲起點。它不是生產準備好的,你必須小心謹慎,因爲第一個替換後的替換工作已經替換了字符串。

這些參數:

  • options是將被傳遞到每個調用regsub
  • resubList的選項列表是鍵/值對的列表,其中關鍵是一個正則表達式和值是替代
  • string是要替換

字符串這是proced ure,它只是簡單地調用regsub多次,對於resubList中的每個元素一次,最後返回最後一個字符串。

proc multiregsub {options resubList string} { 
    foreach {re sub} $resubList { 
     set string [regsub {*}$options -- $re $string $sub] 
    } 
    return $string 
} 
+0

請注意,由於被替換的字符串會迭代多次,所以這會對{a A a b}等情況產生意想不到的結果。這與字符串映射(http://wiki.tcl.tk/2819)不同。 –

+0

是的,我知道;也許我應該更加明確這些警告。 –

相關問題