regsubを使用して式で異なる置換を行うことは可能ですか?
例:
set a ".a/b.c..d/e/f//g"
さて、この式で、1つのregsubコマンドで"" as " " " " as " " " " as " " " " .
as ""を置き換えることはできますか?yes
..
no
/
true
//
false
、regsub
いいえ。この種のものに対する長年の機能要求があります(これは、一致情報でコマンドを評価した結果で置き換える必要があります)が、現在のところ実行されていません。
しかし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
マップを作成するときに、いずれかのfrom-valueが別のプレフィックスである場合は、長いfrom-valueを最初に配置する必要があることに注意してください。(これは、string map
実装が、リストした順序でどの変更を行うかをチェックするためです…)
2段階のプロセスで複数のターゲットの置換を使用regsub
およびsubst
実行することは可能ですが、非常に複雑な場合以外はお勧めしません。ナイスstring map
は操作がはるかに簡単です。
自分でやろうとすることもできます。proc
これは、出発点として使用できるドラフトです。これは本番環境に対応していません。最初の置換の後の置換は、すでに置換された文字列で機能するため、注意が必要です。
これらはパラメータです:
options
へのすべての呼び出しに渡されるオプションのリストですregsub
resubList
キーと値のペアのリストです。ここで、キーは正規表現であり、値は置換です。string
置換したい文字列ですこれはプロシージャであり、regsub
のすべての要素に対して1回ずつ、複数回呼び出すだけresubList
で、最後に最後の文字列を返します。
proc multiregsub {options resubList string} {
foreach {re sub} $resubList {
set string [regsub {*}$options -- $re $string $sub]
}
return $string
}