嗨,我是 TCL 的新手,请帮助我编写代码,方法任何东西。有一个字符串例如 (abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)
我只想删除 () 之间的所有内容,并且只想打印 Hi 和 Hello
嗨,我是 TCL 的新手,请帮助我编写代码,方法任何东西。有一个字符串例如 (abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)
我只想删除 () 之间的所有内容,并且只想打印 Hi 和 Hello
您可以使用 Tclregsub
删除任何带有括号的内容:
set x "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)"
regsub -all {\(.*?\)} $x {} x
puts $x
产生:
$ tclsh foo.tcl
HELLO HI
您还可以在左括号或右括号上拆分字符串,并丢弃奇数元素:
set s "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)"
foreach {out in} [split $s "()"] {puts $out}
你好 你好
我的建议是使用regsub
基于正则表达式执行替换的命令。你可以这样写:
set str {(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)}
set result [ regsub -all {\(.*?\)} $str {} ]
该-all
选项是必需的,因为您的模式可能在源字符串中出现多次,并且您不想只删除第一个。
里面的文字{...}
就是图案。您想匹配括号内的任何内容,因此您使用该\(...\)
部分;转义括号是必需的,因为它们在正则表达式语法中具有特殊含义。
在括号内你想匹配任何重复零次或多次的字符,所以你有.*?
,其中点表示任何字符,而*?
是零个或多个非贪婪重复命令。
这也是只使用正则表达式的一种方式。
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:你好你好