在Tcl_StringCaseMatch中转义方括号

时间:2017-07-10 12:54:34

标签: tcl

我在C ++代码中使用Tcl_StringCaseMatch函数进行字符串模式匹配。一切正常,直到输入模式或字符串具有[]括号。例如,像:

str1 = pq[0]    
pattern = pq[*]        

Tcl_StringCaseMatch无法正常工作,即对上述输入返回false。 如何在模式匹配中避免[]

1 个答案:

答案 0 :(得分:2)

问题是[]是模式匹配中的特殊字符。你需要使用反斜杠来逃避它们,使它们像普通字符一样对待

pattern= "pq\\[*\\]"

我不认为这也应该影响字符串。双重削减的原因是您希望将反斜杠本身传递给TCL引擎。

对于不经意的读者:

[]在TCL中具有特殊意义,超出了他们在这里采用的模式匹配角色 - "运行命令" (比如shell中的``或$()),但[number]没有效果,并且括号被正常处理 - 因此字符串str1不需要在这里转义。

更加困惑:

默认情况下,TCL会将]解释为没有前面的[作为普通字符。我觉得这太混乱了,宁愿TCL抱怨不平衡的括号。正如OP提到的那样,这允许你放弃最后两个反斜杠并使用"pq\\[*]"。我不喜欢这个,而是明确表示两者都是正常对待而不是通常的TCL方式,而是每个人都是自己的。