用空行替换()的TCL代码

用空行替换()的TCL代码,tcl,Tcl,大家好,我是TCL的新手,请帮助我了解代码、方法和任何东西。例如,有一个字符串 (abcgfhdskls12345)你好(hikjkflklfk) (bkjopkjjkl)你好(kjkjjuilpp) 我只想删除()之间的所有内容,只想打印Hi和Hello您可以使用Tcl删除任何带有括号的内容: set x "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)" regsub -all {\(.*?\)} $x {}

大家好,我是TCL的新手,请帮助我了解代码、方法和任何东西。例如,有一个字符串 (abcgfhdskls12345)你好(hikjkflklfk) (bkjopkjjkl)你好(kjkjjuilpp)

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

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

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}
你好 你好
这也是一种仅使用regexp的方法

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: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"