我在C++代码中使用Tcl_StringCaseMatch
函数进行字符串模式匹配。一切正常,直到输入模式或字符串有括号[]
。例如,例如:
str1 = pq[0] 模式 = pq[*]
Tcl_StringCaseMatch
不起作用,即为上述输入返回 false。 如何避免模式匹配[]
?
问题是模式匹配中[]
特殊字符。您需要使用反斜杠对它们进行转义,以将它们视为普通字符
pattern= "pq\[*\]"
我认为这也不会影响字符串。双斜杠的原因是您希望将反斜杠本身传递给 TCL 引擎。
对于普通读者:
一般来说,[]
在 TCL 中具有特殊的含义,超出了它们在这里所扮演的模式匹配角色——"run command"(如 shell 中的 '' 或$()
(,但[number]
不会有任何影响,括号被正常处理——因此字符串str1
在这里不需要转义。
对于额外的困惑:
默认情况下,TCL 会将没有前[
的]
解释为普通字符。我觉得这太混乱了,宁愿TCL抱怨不平衡的括号。正如 OP 所提到的,这允许您放弃最后两个反斜杠并使用"pq\[*]"
.我不喜欢这样,而是很明显两者都是正常对待的,而不是通常的 TCL 方式,而是每个人她/是自己的。