1

regsubを使用して式で異なる置換を行うことは可能ですか?

例:

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

さて、この式で、1つのregsubコマンドで"" as " " " " as " " " " as " " " " .as ""を置き換えることはできますか?yes..no/true//false

4

2 に答える 2

9

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は操作がはるかに簡単です。

于 2012-11-06T21:54:10.843 に答える
2

自分でやろうとすることもできます。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
}
于 2012-11-07T08:41:59.803 に答える