使用regsub可以在表達式中做不同的替換嗎?有沒有辦法使用REGSUB做多個替代?
例如:
set a ".a/b.c..d/e/f//g"
現在,在該表達式中,是有可能替代 「.
」 爲 「yes
」 「..
」 爲 「no
」 「/
」 爲 「true
」 「 //
「作爲」false
「在單個regsub命令?
使用regsub可以在表達式中做不同的替換嗎?有沒有辦法使用REGSUB做多個替代?
例如:
set a ".a/b.c..d/e/f//g"
現在,在該表達式中,是有可能替代 「.
」 爲 「yes
」 「..
」 爲 「no
」 「/
」 爲 「true
」 「 //
「作爲」false
「在單個regsub命令?
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
實現檢查其更改爲了讓你列出他們...)
它可以使用regsub
和subst
做多目標替代的兩步過程,但我除非是非常複雜的情況,否則不要建議它!一個不錯的string map
更容易處理。
你也可以嘗試自己做。這是一份草稿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
}
請注意,由於被替換的字符串會迭代多次,所以這會對{a A a b}等情況產生意想不到的結果。這與字符串映射(http://wiki.tcl.tk/2819)不同。 –
是的,我知道;也許我應該更加明確這些警告。 –
缺少的功能相當於Perl的/// e'。這種情況下的總體矯枉過正... –