2016-12-29 20 views
0

以下のコードを参考にして、例としてstring toupperを選択的に使用するbackrefeenceでregsubを使用しようとしています。私は私が期待しているものを得ていない。
以下の簡単な例を参照してください(私はstring toupper $string 0 0を使用することができますが、これは原理を示すためのものです)。見ることができるようにtcl stringコマンドはregexpの逆参照で動作しません

> puts [ regsub {^(.)} "min" "s\\1" ] 
smin 
> puts [ regsub {^(.)} "min" [ string toupper "\\1" ] ] 
min 

、文字列TOUPPERは動作しません。後方参照に適用されますが、backrefernceは二重引用符の操作に使用することができます。
私はTCL版を使用しています。 8.6

+0

...そして、それは仕事ができる方法は、コマンドが取得toupper' '文字列として、ありません'regsub'コマンドの前に実行されます。 –

+0

https://ideone.com/EjXgjeを参照してください –

答えて

1

string toupperは機能していますが、あなたがしたいことはしません。 string toupper "\\1"は文字列\1であるため、regsubはあまり効果がありません。問題は、regsubには「代替サイトでこのコマンドを実行する」という方法がないことです。私はこれを何年も修正したいと思っていましたが、これを実際にやったことはありませんでした。

代わりに、文字列にコマンド置換でregsubに必要な、その後subst結果を、それを行うためには、まずstring mapsubstにそうでない場合は、安全な文字列を作成する必要があります。幸いにも、それは実際にはかなりシンプルです。

私は離れますが、各ステージが何をしているかを正確に調べるしやすくするために、これを分割しました:

set str "here is an example with \$dollars, \[brackets\] and \\backslashes" 

# Quote all of Tcl's metacharacters; there's not that many 
set safer [string map {[ \\[ ] \\] \\ \\\\ $ \\$} $str] 

# Inject the command we want to run where we want to run it 
set withsubst [regsub {^(.)} $safer {[string toupper {\1}]}] 

# Perform the substitution 
set result [subst $withsubst] 
+0

私は 'regsub -command'プロポーザルを書くべきです... –

+0

これは、Rubyなどが提供する正規表現の置き換えで見つかるものよりもはるかに複雑です。私はいくつかのラップアラウンドプロシージャをクックアップしようとします。ありがとうございました – user1134991

+1

私は知っています。このようなことを何年もやる必要があることは私を刺激しています。 –

関連する問題