У меня есть следующий код:
set a "10.20.30.40"
regsub -all {.([0-9]+).([0-9]+).} $a {\2 \1} b
Я пытаюсь найти 2-й и 3-й октет IP-адреса.
Ожидаемый результат:
20 30
Фактический результат:
20 04 0
В чем здесь моя ошибка?
У меня есть следующий код:
set a "10.20.30.40"
regsub -all {.([0-9]+).([0-9]+).} $a {\2 \1} b
Я пытаюсь найти 2-й и 3-й октет IP-адреса.
Ожидаемый результат:
20 30
Фактический результат:
20 04 0
В чем здесь моя ошибка?
Вам нужно установить переменные для совпадений и захваченных групп, после чего вы сможете получить к ним доступ. Вот пример:
set a "10.20.30.40"
set rest [regexp {[0-9]+\.([0-9]+)\.([0-9]+)\.[0-9]+} $a match submatch1 submatch2]
puts $submatch1
puts $submatch2
Вывод демо
20
30
ИЗМЕНИТЬ:
Таким образом вы можете использовать regsub и backerferences (сейчас я заменяю 3-й и 2-й октеты просто для демонстрации). Обратите внимание, что буквальная точка должна быть экранирована:
set a "10.20.30.40"
regsub -all {\.([0-9]+)\.([0-9]+)\.} $a {.\2.\1.} b
puts $b
Вывод демо:
10.30.20.40
Чтобы получить строку «20 30», вам нужно использовать
regsub -all {^[0-9]+\.([0-9]+)\.([0-9]+)\.[0-9]+$} $a {\1 \2} b
set a "1 abc 2 abc 3 abc 4 abc 5 abc 6 abc 7 abcd" \\NEWLINE regsub {([0-9]+\s+)abc( +[0-9]+ +)abc( +[0-9]+ +)abc(.*)} $a {\1bhu\2bhu\3bhu\4} b \\NEWLINE puts $b
. Вместо \\NEWLINE
используйте настоящую новую строку.
- person Wiktor Stribiżew; 21.05.2015
Я бы вообще держался подальше от регулярных выражений:
set b [join [lrange [split $a .] 1 2]]
Разделите значение на точки, возьмите 2-й и 3-й элементы и соедините их пробелом.
20.30.
в переменнойa
и заменить его другим? - person Dinesh   schedule 19.05.2015regsub
?regexp
достаточно, верно? Зачем еще и обратная ссылка? - person Dinesh   schedule 19.05.2015split
вместо того, чтобы пытаться сделать это...[split $a .]
дает вам{10 20 30 40}
, который вы можете легко использоватьlrange
, чтобы собрать второй и третий элементы вместе... - person Jerry   schedule 19.05.2015