1

Tcl の文字列変数から、空白、ハイフンなどを含むすべての特殊文字をアンダースコアに置き換えようとしています。

    input: Stack Overflow helps%me(a lot
    output: Stack_Overflow_helps_me_a_lot

以下のコードを書きましたが、動作していないようです。

    set varname $origVar
    puts "Variable Name :>> $varname"
    if {$varname != ""} {
        regsub -all {[\s-\]\[$^?+*()|\\%&#]} $varname "_" $newVar
    }
    puts "New Variable :>> $newVar"

1 つの問題は、$varname の文字列を置き換える代わりに、$varname ではなく $origVar 内で最初に検出されたスペースの後にデータを削除することです。また、$newVar に格納される値はありません。理由がわかりません。また、tclの本のサンプルコード(適切な構文について)を読みましたが、それによると、このようなものになるはずです

    regsub -all {[\s-][$^?+*()|\\%&#]} $varname "_" newVar

そのため、同じ構文を使用しましたが、機能せず、必要な $varname 値の代わりに $origVar を変更した場合と同じ結果になりました。

4

2 に答える 2

3

2番目のバージョンはより近いです。結果を に入れることで、実際には に格納され$newVarている名前の変数が設定されます。つまり、いわば でアクセスする必要があります (Tcl では有効ではありません)。とにかく、おそらく問題は、2 番目のバージョンでは、特定の文字をエスケープしていないように見えることです。これを試して: $newVar$$newVar

regsub -all {[\s\-\]\[$^?+*()|\\%&#]} $varname "_" newVar

エスケープを最小限に抑えるためにそれを整理する別の方法は次のとおりです。

regsub -all {[][\s$^?+*()|\\%&#-]} $varname "_" newVar

また、これが一般的すぎるかどうかはわかりませんが、これも試すことができます。

regsub -all {\W} $varname "_" newVar
于 2012-10-01T21:55:49.120 に答える
2

もう 1 つの解決策は、string mapより簡単なコマンドを使用することです。string map コマンドは、古い/新しいリストと文字列を受け取ります。

set varname [string map {% _ ( _ " " _} $varname]

上記の例では、簡潔にするために、%、(、およびスペース " " のみをアンダースコアに置き換えました。このソリューションの欠点は、古い/新しいリストが多少長くなる可能性があることです。利点は、理解しやすいことです。

于 2012-10-02T04:09:28.473 に答える