当变量可能有括号(TCL)时将变量传递给regexp

时间:2014-02-28 18:47:35

标签: regex tcl

在我的工作中,我经常处理名字可能包含方括号的实体。我们大多使用tcl,因此方括号有时会造成严重破坏。我正在尝试执行以下操作:

set pat {pair_shap_val[9]}
set aff {pair_shap_val[9]_affin_input}
echo [regexp "${pat}_affin.*" $aff]

然而,当我期望1时,这会返回0.我确定当${pat}传递给regexp引擎时,括号将被展开并读作“[9]”而不是“ [9]。”

当变量本身可能有特殊的正则表达式字符时,如何对正则表达式进行短语以使模式包含变量?

编辑:设置$ pat时,一个简单的方法就是转义括号。但是,$ pat的值是通过函数传递给我的,所以我不能轻易做到。

1 个答案:

答案 0 :(得分:1)

只是无情地逃脱所有非单词字符:

set pat {pair_shap_val[9]}
set aff {pair_shap_val[9]_affin_input}
puts [regexp "${pat}_affin.*" $aff]         ;# ==> 0

set escaped_pat [regsub -all {\W} $pat {\\&}]
puts $escaped_pat                           ;# ==> pair_shap_val\[9\]
puts [regexp "${escaped_pat}_affin.*" $aff] ;# ==> 1

第二个想法:这似乎并不需要正则表达式匹配。您似乎只需要检查pat字符串中是否包含aff字符串:

% expr {[string first $pat $aff] != -1}
1