我在C ++代码中使用Tcl_StringCaseMatch
函数进行字符串模式匹配。一切正常,直到输入模式或字符串具有[]
括号。例如,像:
str1 = pq[0] pattern = pq[*]
Tcl_StringCaseMatch
无法正常工作,即对上述输入返回false。
如何在模式匹配中避免[]
?
答案 0 :(得分:2)
问题是[]
是模式匹配中的特殊字符。你需要使用反斜杠来逃避它们,使它们像普通字符一样对待
pattern= "pq\\[*\\]"
我不认为这也应该影响字符串。双重削减的原因是您希望将反斜杠本身传递给TCL引擎。
对于不经意的读者:
[]
在TCL中具有特殊意义,超出了他们在这里采用的模式匹配角色 - "运行命令" (比如shell中的``或$()
),但[number]
没有效果,并且括号被正常处理 - 因此字符串str1
不需要在这里转义。
更加困惑:
默认情况下,TCL会将]
解释为没有前面的[
作为普通字符。我觉得这太混乱了,宁愿TCL抱怨不平衡的括号。正如OP提到的那样,这允许你放弃最后两个反斜杠并使用"pq\\[*]"
。我不喜欢这个,而是明确表示两者都是正常对待而不是通常的TCL方式,而是每个人都是自己的。