2016-08-15 266 views
1

我尝试使用正则表达式命令等:tcl如何在正则表达式输出中处理方括号?

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

但是,当存在在字符串中没有括号,输出格式是不同的。

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

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

+0

你问的是方括号,或者你在第一个命令返回的列表中看到大括号? – Mariano

+0

对不起。我在问,为什么第一个元素在第一种情况下需要花括号? –

回答

2

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

因此,评价发现每方括号中,包括由分隔的字符串内。

因此,当它返回正则表达式匹配它把卷边支架,以保护被解释为包含的命令字符串。

即使这样,其结果仍然是一个字符串

例如,如果你这样做:

% set r [regexp -all -inline {\S+} "RR\[0\] in"] 
{RR[0]} in 

然后你从一个循环打印:

% foreach x $r { puts $x } 
RR[0] 
in 

通过加入命令,你可以很容易地转换成任何类型的列表进入,当你需要一个字符串,避免与装饰功能中的括号去掉。

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

或直接的元素:

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

首先,按正确方式运行正则表达式时出现错误。它应该是:

regexp -all -inline {\S+} {RR[0] in} 

随着串绕括号您在搜索由于方barckets被解释为命令,如果你一定要告诉TCL不作替换,和的方式来告诉它是一个。通过使用大括号。

这样说,当括号不存在时,当然,正则表达式不会找到它们。

+0

谢谢。实际上,我的意思是在第一种情况下的“RR \ [0 \]”。为什么第一个元素在第一种情况下需要花括号 –