tcl如何处理regexp输出中的方括号?

tcl如何处理regexp输出中的方括号?,regex,string,tcl,Regex,String,Tcl,我尝试使用正则表达式命令,如: IN: regexp -all -inline {\S+} "RR\[0\] in" OUT:{RR[0]} in 但是,当字符串中没有方括号时,输出格式不同 IN: regexp -all -inline {\S+} "RR in" OUT:RR in 为什么第一个元素在第一种情况下位于大括号之间?首先,按原样运行regexp时出错。应该是: regexp -all -inline {\S+} {RR[0] in} 在搜索的字符串周围使用大括号。因为方形b

我尝试使用正则表达式命令,如:

IN: regexp -all -inline {\S+} "RR\[0\] in"
OUT:{RR[0]} in
但是,当字符串中没有方括号时,输出格式不同

IN: regexp -all -inline {\S+} "RR in"
OUT:RR in

为什么第一个元素在第一种情况下位于大括号之间?

首先,按原样运行regexp时出错。应该是:

regexp -all -inline {\S+} {RR[0] in}
在搜索的字符串周围使用大括号。因为方形barckets被解释为一个命令,如果您必须告诉tcl不要进行替换,那么告诉它的方法之一就是使用大括号


当然,当括号不存在时,regexp将找不到它们。

问题是tcl中保留了方括号用于执行命令

因此,它会计算找到的每个方括号,包括字符串中以“.”分隔的方括号

因此,当它返回与之匹配的regexp时,将放上括号以保护要解释为包含命令的字符串

即使如此,结果仍然是一个字符串

例如,如果您这样做:

% set r [regexp -all -inline {\S+} "RR\[0\] in"]
{RR[0]} in
然后从循环打印:

% foreach x $r { puts $x }
RR[0]
in
通过join命令,您可以在需要时轻松地将任何类型的列表转换为字符串,避免使用trim函数删除括号

% puts [join $r ]
RR[0] in
或直接指向元素:

% puts [join [lindex $r 0] ]
RR[0]

您是在询问第一个命令返回的列表中的方括号还是花括号?抱歉。我是在问为什么第一个元素在第一种情况下需要花括号?谢谢。实际上,我的意思是第一种情况下的“RR[0]in”。为什么第一个元素在第一种情况下需要花括号