私があなたの質問を理解しているかどうか見てみましょう。Tcl 文字列があり、と の部分を$::env(something)/somethingelse/識別するパターンを一致させたいとします。somethingsomethingelse
もしそうなら、あなたは何かを使いたいと思う
set str {$::env(WORK)/bill/}
if {[regexp {\$::env\((.+)\)/(.+)/} $string -> envName dirName]} {
puts $envName
puts $dirName
}
そして、あなたは持っているべきです
WORK
bill
端末に印刷されます。
regexpコマンドでは、Tcl 置換を避けるためにパターンが含まれて{}います。\$ドルは行末に一致するため、エスケープされたドルで始まります。その後、リテラル::envが続きます。\(...\)次に、配列構文に一致するように括弧をエスケープしました。それらの中に、(.+)1 回以上繰り返される任意の文字を照合するためのキャプチャ アトムがあり、レポートを作成します。次に、ディレクトリ部分を照合するため/.../の 2 番目のキャプチャ アトムがリテラル スラッシュに続きます。(.+)
は、パターンに一致する->すべてのものを含む変数の名前です$str( で出力することで確認できますputs ${->}) が、この場合は必要ないため、奇妙な名前を使用します。
次に 2 つの var 名が続き、envNameとdirNameで、それぞれ最初と 2 番目のアトム(.+)(括弧は除く) の一致を報告します。
編集Donal Fellowsが指摘したように、貪欲でないマッチングの場合は、(.+?)の代わりに使用できます(.+)。これは素晴らしい追加になると思います。
これがあなたのニーズに答えることを願っています。