2012-02-07 49 views
3

我正在使用tcl從腳本中解析SOAP消息中的某個故障代碼,並且我終於找到了將消息與所需消息進行比較的部分。正如你所看到的,我想檢查是否字符串「9000」包含在數組元素「$皁(錯誤)」使用字符串匹配時,是否需要轉義特殊字符?


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

    # -- Success case 

} else { 

    # -- fail case 

} 

在這個例子中我提供,我已經逃脫了tcl中的所有「特殊字符」:

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

但是它是必需的嗎?難道一個簡單地做:

*<FaultCode>9000</FaultCode>* ? 

我已經很徹底環顧四周,一直沒能找到的東西相當那樣精確,什麼我問。我打算在tcl聊天室裏問,但我找不到一個!

感謝

+0

有一個Tcl聊天:http://www.tcl.tk/community/ – 2012-02-07 18:52:56

回答

4

簡短的回答是沒有,你不需要逃避所有這些字符。實際上,其中一些角色甚至不是特別的。

有兩層這裏:第一,在TCL分析水平:通過tcl's parsing rules讀書,你有幾個選擇:

  • 裹在雙引號你的論點。 (但是你必須擔心嵌入的引號,[命令]和$變量)
  • 把你的論點放在大括號中。 (但是你不得不擔心嵌套的大括號)
  • 使用上面的裸字(但是你必須擔心上面的雙引號引導括號,引號,空格和一切)

所有這些只是決定傳遞給[字符串匹配]的內容 - 第二層涉及[字符串匹配]如何處理此模式(順便說一下,它不是一個正則表達式,它只是一個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) 
0

免責聲明:我不知道TCL,只是正則表達式

Apparently,在TCL,建議包圍你的正則表達式用雙引號"regex"或大括號{regex} - 那麼你不不需要擔心逃脫任何不是正則表達式保留字符的東西。

我敢肯定,<>不需要進行轉義。

我不知道*可以用作雖然周邊的項目 - 這是一個正則表達式保留字符。 鑑於此,我建議你不要做這樣的:{<FaultCode>9000</FaultCode>}

+0

我正在使用*作爲它們在正則表達式中的用途,通配符。我相信在每一端都會有一個,如果我的字符串在字符串中的任何位置,它將返回true,這正是我想要的。 – Joshua 2012-02-07 16:38:00

+1

僅供參考,'字符串匹配'不使用正則表達式。 – 2012-02-07 16:57:48

+0

啊我不好 - 我被「正則表達式」標籤矇蔽了。 @Joshua,如果你想在正則表達式中使用通配符,它​​實際上看起來像'。*',因爲'*'適用於它前面的項目,不應該被自己使用。 – 2012-02-07 17:26:22

1

另一個(更簡單的IMO)的做法是隻搜索的字符串對於給定的子串的存在,看看如果搜索成功,就像這樣:

set found [expr {[string first $needle $haystack] >= 0}] 

這只是一個簡單的搜索,沒有琴絃被以任何方式所以沒有關於轉義後顧之憂解釋。

換句話說,您的特殊需求太簡單了,無法拋棄用於更重吊具的工具。例如,如果您需要搜索,例如,您想要使用正則表達式或glob匹配,「一個以<FaultCode>開頭的子字符串,然後包含'0' - '9'範圍內的一組相鄰字符,並以</FaultCode>「 - 就是這樣,特別是使用正則表達式引擎,允許您從字符串中提取數字字符的不確定子字符串。

此外,我覺得我應該在這樣的情況下做一個筆記強制性的:用XML工具解析XML是不明智的。特別是有tclsoaptdom