2

嗨,我是 TCL 的新手,请帮助我编写代码,方法任何东西。有一个字符串例如 (abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)

我只想删除 () 之间的所有内容,并且只想打印 Hi 和 Hello

4

4 回答 4

3

您可以使用 Tclregsub删除任何带有括号的内容:

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

产生:

$ tclsh foo.tcl
HELLO HI
于 2013-10-21T06:06:20.977 回答
0

您还可以在左括号或右括号上拆分字符串,并丢弃奇数元素:

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

你好

于 2013-10-21T15:22:22.623 回答
0

我的建议是使用regsub基于正则表达式执行替换的命令。你可以这样写:

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

-all选项是必需的,因为您的模式可能在源字符串中出现多次,并且您不想只删除第一个。

里面的文字{...}就是图案。您想匹配括号内的任何内容,因此您使用该\(...\)部分;转义括号是必需的,因为它们在正则表达式语法中具有特殊含义。

在括号内你想匹配任何重复零次或多次的字符,所以你有.*?,其中表示任何字符,而*?是零个或多个非贪婪重复命令。

于 2013-10-21T06:08:03.400 回答
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:你好你好

于 2015-10-03T09:26:20.510 回答