2013-10-21 51 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