gpt4 book ai didi

escaping - 使用字符串匹配时,是否需要对特殊字符进行转义?

转载 作者:行者123 更新时间:2023-12-01 10:07:18 25 4
gpt4 key购买 nike

我正在编写一个脚本,使用 tcl 从 SOAP 消息中解析出某个故障代码,我终于来到了将消息与所需消息进行比较的部分。如您所见,我正在尝试检查字符串“9000”是否包含在数组元素“$soap(Fault)”中


if { [ string match *\<FaultCode\>9000\</FaultCode\>* $soap(Fault) ] } {

# -- Success case

} else {

# -- fail case

}

在我提供的示例中,我已经转义了 tcl 中的所有“特殊字符”:

&;`'"|*?~<>^()[]{}$\

但这是必需的吗?可以简单地做:

*<FaultCode>9000</FaultCode>*  ?

我已经非常彻底地环顾四周,但未能找到与我所要求的一样精确的东西。本来想去tcl聊天室问问,没找到!

谢谢

最佳答案

简短的回答是,不,您不需要转义所有这些字符。事实上,其中一些字符甚至并不特殊。

这里有两层:首先,在tcl解析层:读通tcl's parsing rules ,您有几个选择:

  • 将您的论点用双引号引起来。 (但是你必须担心嵌入的引号、[命令] 和 $ 变量)
  • 用大括号括起你的论点。 (但是你必须担心嵌套大括号)
  • 像上面那样使用裸词(但是你必须担心前导括号、引号、空格以及上面双引号的所有内容。)

所有这些只是确定传递给 [string match] 的内容 - 第二层涉及 [string match] 如何处理此模式(它不是正则表达式,顺便说一下,它只是一个 glob-style pattern )。 tcl 的 glob 样式模式中只有这些特殊字符:*、?、[]、.如果您希望其中任何一个被视为文字,则必须对它们进行转义。任何其他内容都被视为文字匹配,因此您不必担心 <> 或/。

所以,这条线没问题:

string match *<FaultCode>9000</FaultCode>* $soap(Fault)

但您也可以使用这些样式在风格上衬托匹配模式。

string match "*<FaultCode>9000</FaultCode>*" $soap(Fault)
string match {*<FaultCode>9000</FaultCode>*} $soap(Fault)

关于escaping - 使用字符串匹配时,是否需要对特殊字符进行转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9179785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com