2013-10-21 48 views
2

你好我是TCL的新手,請幫我用代碼,方法什麼的。例如存在一個字符串 (abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)用空行代替()的TCL代碼

我只是想刪除(之間的一切),並希望只打印Hi和你好

回答

3

你可以使用TCL regsub刪除與任何括號周圍:

set x "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)" 
regsub -all {\(.*?\)} $x {} x 
puts $x 

這將產生:

$ tclsh foo.tcl 
HELLO HI 
+3

你或許應該用[^()]的'*''而不是*'這裏;當輸入格式錯誤時,它具有更可預測的行爲。 (好吧,對於RE發動機的非專業人員來說更可預測。) –

0

我的建議是使用regsub命令,該命令根據正則表達式執行替換。你可以寫這樣的事:因爲你的模式可能會不止一次出現在源字符串中,你不想大道僅有第一

set str {(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)} 
set result [ regsub -all {\(.*?\)} $str {} ] 

-all選項是必需的。

{...}裏面的文字是圖案。你想匹配括號內的任何東西,所以你使用\(...\)部分;轉義括號是必需的,因爲它們在正則表達式語法中具有特殊含義。你想

括號內匹配任何字符重複零次或更多次,讓你有.*?,其中指任何字符和*?是零或更多的非貪婪重複命令。

0

你也可以拆分上打開或關閉括號中的字符串,並拋出了奇數元素:

set s "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)" 
foreach {out in} [split $s "()"] {puts $out} 
 

HELLO 

HI 

0

這也是唯一使用正則表達式的方法。

set p {(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)} 
set pol [regexp {(.*)(HELLO)(.*) (.*)(HI)(.*)} $p p1 p2 p3 p4 p5 p6] 
puts "$p3 $p6" 

O/P:你好HI