你好我是TCL的新手,請幫我用代碼,方法什麼的。例如存在一個字符串 (abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)用空行代替()的TCL代碼
我只是想刪除(之間的一切),並希望只打印Hi和你好
你好我是TCL的新手,請幫我用代碼,方法什麼的。例如存在一個字符串 (abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)用空行代替()的TCL代碼
我只是想刪除(之間的一切),並希望只打印Hi和你好
你可以使用TCL regsub
刪除與任何括號周圍:
set x "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)"
regsub -all {\(.*?\)} $x {} x
puts $x
這將產生:
$ tclsh foo.tcl
HELLO HI
我的建議是使用regsub
命令,該命令根據正則表達式執行替換。你可以寫這樣的事:因爲你的模式可能會不止一次出現在源字符串中,你不想大道僅有第一
set str {(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)}
set result [ regsub -all {\(.*?\)} $str {} ]
的-all
選項是必需的。
{...}
裏面的文字是圖案。你想匹配括號內的任何東西,所以你使用\(...\)
部分;轉義括號是必需的,因爲它們在正則表達式語法中具有特殊含義。你想
括號內匹配任何字符重複零次或更多次,讓你有.*?
,其中點指任何字符和*?
是零或更多的非貪婪重複命令。
你也可以拆分上打開或關閉括號中的字符串,並拋出了奇數元素:
set s "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)"
foreach {out in} [split $s "()"] {puts $out}
HELLO HI
這也是唯一使用正則表達式的方法。
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
你或許應該用[^()]的'*''而不是*'這裏;當輸入格式錯誤時,它具有更可預測的行爲。 (好吧,對於RE發動機的非專業人員來說更可預測。) –