2017-07-10 46 views
0

我在C++代碼中使用Tcl_StringCaseMatch函數進行字符串模式匹配。一切正常,直到輸入模式或字符串有[]括號。例如,如:在Tcl_StringCaseMatch中轉義方括號

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

Tcl_StringCaseMatch不起作用,即返回上述輸入的錯誤。 如何避免[]模式匹配?

回答

2

問題是[]是模式匹配中的特殊字符。你需要用一個反斜槓逃脫他們讓他們像普通的字符處理

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

我不認爲這應該不會影響字符串爲好。雙斜槓的原因是你想把反斜槓本身傳遞給TCL引擎。

對於普通讀者:

[]在TCL有特殊含義在一般情況下,超過匹配他們在這裏採取的角色模式 - 「運行命令」(如`在shell中`或$()),但[number]將有沒有效果,並且括號被正常處理 - 因此字符串str1不需要在這裏轉義。

對於額外的困惑:

TCL將解釋]沒有前面[作爲默認爲普通字符。我覺得這太混亂了,寧願TCL抱怨不平衡的括號。正如OP提到的,這允許你放棄最後的兩個反斜槓並使用"pq\\[*]"。我不喜歡這一點,而是明確表示兩者都是正常對待,而不是通常的TCL方式,但是對於每個人來說都是自己的。

+0

需要逃脫兩個支架或只是打開一個? –

+0

@AvinashKumar如果TCL在沒有前綴'['的情況下看到一個']',它就認爲它是一個常規字符,這就是它工作的原因。我寧願拋出一個錯誤。我認爲它很混亂,所以我沒有把它添加到解決方案中,但正如你所說 - 它的工作原理。 – kabanus

+0

@AvinashKumar你改變了你的評論內聯。你之前的一個更好 - 你只能逃脫第一個,但看到我的編輯。 – kabanus