Механизм регулярных выражений Tcl не выполняет переменную интерполяцию.(Должно ли это? Возможно. Возможно, это не так.) Это означает, что вам нужно делать это на общем уровне, что в целом довольно раздражает, но здесь все в порядке, поскольку переменные имеют только числа, которые сами по себе никогда не являются метасимволами RE.
Базовая версия (с SO. МНОГО. BACKSLASHES.):
if {[regexp "street\\\[$A\\\].*block\\\[$B\\\]" $address]} {
Более хорошая версия с format
:
if {[regexp [format {street\[%d\].*block\[%d\]} $A $B] $address]} {
Вы также можете использовать subst -nocommands -nobackslashes
но это становится менее элегантным.
Если вам нужно поддерживать общие замены, достаточно использовать regsub
для защиты.
proc protect {string} {
regsub -all {\W} $string {\\&}
}
# ...
if {[regexp [format {street\[%s\].*block\[%s\]} [protect $A] [protect $B]] $address]} {
Когда вызнаю, что вы работаете с буквенно-цифровыми заменами в RE.