你好我是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发动机的非专业人员来说更可预测。) –