私があなたの質問を理解しているかどうか見てみましょう。Tcl 文字列があり、と の部分を$::env(something)/somethingelse/
識別するパターンを一致させたいとします。something
somethingelse
もしそうなら、あなたは何かを使いたいと思う
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が指摘したように、貪欲でないマッチングの場合は、(.+?)
の代わりに使用できます(.+)
。これは素晴らしい追加になると思います。
これがあなたのニーズに答えることを願っています。