2013-02-23 59 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