转义字符串,将其放入TCL中的正则表达式

时间:2013-02-23 16:34:55

标签: escaping tcl expect

我使用Expect作为测试框架并编写一些辅助函数来简化expect命令匹配模式的输入。

所以我寻找将任何字符串转换为字符串的函数,其中所有特殊正则表达式语法都被转义(例如*|+[和其他字符)所以我可以将任何字符串放入正则表达式而不必担心我打破正则表达式:

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{}}]

1 个答案:

答案 0 :(得分:5)

一个安全的策略是逃避所有非单词字符:

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\$