регулярное выражение tcl для поиска переменных - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь найти подходящий шаблон, используя команду regexp в {if loop}.Все еще новичок в Tcl.Код такой, как показано ниже:

set A 0;
set B 2;
set address "my_street[0]_block[2]_road";
if {[regexp {street\[$A\].*block\[$B\]} $address]} {
puts "the location is found"
}

Я ожидаю, что результат выдаст «местоположение найдено», так как адрес $ содержит совпадающие переменные A и B.Я надеюсь, что смогу изменить номер A и B для списка $ address.но я не могу получить результат, чтобы вернуть "местоположение найдено".

Спасибо.

1 Ответ

0 голосов
/ 29 января 2019

Механизм регулярных выражений 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...