0

TCL で regsub を使用して、文字列を配列の値に置き換えようとしています。

array set myArray "
one 1
two 2
"
set myString "\[%one%\],\[%two%\]"

regsub -all "\[%(.+?)%\]" $myString "$myArray(\\1)" newString

私の目標は、文字列を "[%one%],[%two%]" から "1,2" に変換することです。問題は、キャプチャ グループのインデックスが解決されていないことです。次のエラーが表示されます。

can't read "myArray(\1)": no such element in array
while executing
"regsub -all "\[%(.+?)%\]" $myString "$myArray(\\1)" newString"
4

2 に答える 2

1

regsub+ subst(一般的に安全に使用するには明らかにトリッキーなコマンドのペアです) を使用する以外に、を使用して比較的単純な変換を行うこともできますstring map。秘訣は、マッピングを準備する方法にあります。

# It's conventional to use [array set] like this…
array set myArray {
    one 1
    two 2
}
set myString "\[%one%\],\[%two%\]"

# Build the transform
set transform {}
foreach {from to} [array get myArray] {
    lappend transform "\[%$from%\]" $to
}

# Apply the transform
set changedString [string map $transform $myString]
puts "transformed from '$myString' to '$changedString'"

行きたいところや行きたいところがアプリケーションの時点で定数文字列である限り、それを行うために使用できますstring map。利点?明らかに正しいです。regsub+変換を明らかに正しくすることは非常に困難substです (ただし、より複雑な変換が必要な場合は必要です。これは、たとえば URL で %XX エンコードとデコードを行う正しい方法です)。

于 2013-10-31T17:14:12.957 に答える
1

これは、Tcl での 2 段階のプロセスです。ここでの主な間違いは、どこでも二重引用符を使用していることです。

array set myArray {one 1 two 2}
set myString {[%one%],[%two%]}
regsub -all {\[%(.+?)%\]} $myString {$myArray(\1)} new
puts $new
puts [subst -nobackslash -nocommand $new]
$myArray(one),$myArray(two)
1,2

そのregsubため、式を検索して、展開したい変数の文字列表現に置き換えます。次に、めったに使用されないsubstコマンドを使用して、変数 (のみ) の置換を実行します。

于 2013-10-30T23:42:09.753 に答える