2013-02-23 56 views
2

我使用Expect作爲測試框架並編寫一些輔助函數來簡化expect命令的匹配模式的輸入。將字符串放入TCL的正則表達式中

所以我尋找那些將任何字符串轉換成字符串,其中所有特殊的正則表達式的語法逃脫(如*|+[和其他字符)功能,這樣我就可以把任何字符串轉換成正則表達式,而不必擔心我打破正則表達式:

expect -re "^error: [escape $str](.*)\\." 
refex "^error: [escape $str](.*)\\." "lookup string..." 

對於expect -exexpect -gl這是很容易寫逃生功能。但對於expect -re這是很難,因爲我是新手,以TCL ......

PS我寫這篇文章的代碼,目前對其進行測試:

proc reEscape {str} { 
    return [string map { 
     "]" "\\]" "[" "\\[" "{" "\\{" "}" "\\}" 
     "$" "\\$" "^" "\\^" 
     "?" "\\?" "+" "\\+" "*" "\\*" 
     "(" "\\(" ")" "\\)" "|" "\\|" "\\" "\\\\" 
    } $str] 
} 

puts [reEscape {[]*+?\n{}}] 

回答

4

一個安全策略是逃避所有非單詞字符:

proc reEscape {str} { 
    regsub -all {\W} $str {\\&} 
} 

&將被替換爲表達式中匹配的任何內容。

% set str {^this is (a string)+? with REGEX* |metacharacters$} 
^this is (a string)+? with REGEX* |metacharacters$ 

% set escaped [reEscape $str] 
\^this\ is\ \(a\ string\)\+\?\ with\ REGEX\*\ \|metacharacters\$ 
+0

謝謝!我在tcl wiki上看過這個,但不明白這個技巧。 +1 – gavenkoa 2013-02-23 18:40:06

+0

我找不到原始鏈接,但這有幫助http://wiki.tcl.tk/989(正則表達式示例)。 – gavenkoa 2013-02-23 18:43:09

+1

@gavenkoa你不瞭解它嗎?我們很樂意幫助您理解。 (雖然可以更好地完成自己的問題,以便其他人更容易搜索,但只要它們不同,就可以提出多個問題 - 在Stack Overflow中絕對可以。) – 2013-02-24 13:20:26