0

以下に示すようなパターンに一致させたいと思います。これは、環境変数の後にディレクトリ名が続くものです。両方の言葉を正確に一致させたいです。一致する場合は 1 を返します。

$::env(WORK)/bill/

regexpを使用してTCLでこれを行うにはどうすればよいですか?
私は初心者なので、助けていただければ幸いです。ありがとう。

私はこれで試してみましたが、うまくいきます:

if {![file isdirectory "${::env(WORK)}/bill/"]} {} else { return 1} 

RE: regexp {^(bill)$} を 2 番目の単語に使用します。それは環境変数であるため、最初の単語はそこで立ち往生します

4

1 に答える 1

1

私があなたの質問を理解しているかどうか見てみましょう。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 名が続き、envNamedirNameで、それぞれ最初と 2 番目のアトム(.+)(括弧は除く) の一致を報告します。

編集Donal Fellowsが指摘したように、貪欲でないマッチングの場合は、(.+?)の代わりに使用できます(.+)。これは素晴らしい追加になると思います。

これがあなたのニーズに答えることを願っています。

于 2013-02-24T09:56:37.163 に答える