2016-12-29 43 views
0

看到下面的代碼,作爲一個例子,我試圖找到使用regsub與backrefeence作爲選擇性使用string toupper的手段。我沒有得到我所期望的。
查看下面的簡單例子(是的,我知道我可以使用string toupper $string 0 0,但是,這只是爲了顯示原理,在一個簡單的例子中)。tcl字符串命令不能與正則表達式反向引用

> 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的結果,但爲了做到這一點,你需要先進行串否則安全subststring map。幸運的是,這其實很簡單。

我已經拆分此分開,使它更容易爲你檢查什麼每個階段做:

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命令的提議...... –

+0

那麼,這肯定比你在Ruby提供的正則表達式替換中找到的要複雜得多。我會嘗試製作一些環繞程序。謝謝 – user1134991

+1

我知道;多年來我們一直在激怒我,我們需要做這種事情。 –