在我的工作中,我经常处理名字可能包含方括号的实体。我们大多使用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的值是通过函数传递给我的,所以我不能轻易做到。
答案 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