TCL regsub не работает, когда выражение имеет [0] - PullRequest
2 голосов
/ 07 сентября 2010

Я попробовал следующий код:

set exp {elem[0]}
set temp {elem[0]}

regsub $temp $exp "1" exp

if {$exp} {
    puts "######### 111111111111111 ################"
} else {
    puts "########### 0000000000000000 ############"
}

Конечно, это самый простой из возможных вариантов regsub (слова полностью совпадают), и все же он не работает, и подстановка не производится. если я пишу elem вместо elem [0], все работает нормально. Я пытался использовать {elem [0]}, elem [0], "elem [0]" и т. Д., И ни один из них не работал. Любая подсказка кого-нибудь?

Ответы [ 2 ]

6 голосов
/ 07 сентября 2010

Это самый простой regsub из возможных (слова полностью совпадают)

На самом деле, нет, слова не совпадают. Видите ли, в регулярном выражении квадратные скобки имеют значение. Ваше выражение {elem[0]} на самом деле означает:

match the sequence of letters 'e'
                  followed by 'l'
                  followed by 'e'
                  followed by 'm'
                  followed by '0' (the character for the number zero)

Таким образом, она будет соответствовать строке «elem0», а не «elem [0]», поскольку символ после «m» не равен «0».

То, что вы хотите, это {elem\[0\]} <- обратный слеш избегает специального значения. </p>

Прочтите руководство по синтаксису регулярных выражений tcl, re_syntax , для получения дополнительной информации о том, как регулярные выражения работают в tcl.

3 голосов
/ 07 сентября 2010

В дополнение к ответу @ slebetman, если вы хотите, чтобы какие-либо специальные символы в вашем регулярном выражении обрабатывались как обычный текст, для этого есть специальный синтаксис:

set word {abd[0]}
set regex $word
regexp $regex $word        ;# => returns 0, did not match
regexp "(?q)$regex" $word  ;# => returns 1, matched

Этот маркер (?q) должен бытьпервая часть RE.

Кроме того, если вы действительно просто сравниваете буквенные строки, рассмотрите более простое if {$str1 eq $str2} ... или сопоставление в стиле глобуса [string match]

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