2016-04-12 2 views
1

я должен разделить IP-адрес и порт и использовать этот кодНабор переменных в регулярном выражении с совпадающими нулевой или один

set str 192.168.1.1:44 
set port 23 
regexp {(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d+)?} $str all ip port 
puts $ip 
puts $port 

И это прекрасно работает. Но если использовать $ str без порта (например, 192.168.1.1), ни одна из переменных не была установлена, а TCL возвращает ошибку.

can't read "ip": no such variable 

Regex все еще соответствует «192.168.1.1», без порта (я проверил его с «если» заявление) без порта, но почему она не возвращает переменные? Я ожидал $ all и $ ip.

+1

Он должен быть '(: \ d +)' ..you нужно сделать 'colon' дополнительные – rock321987

ответ

1

Вы должны делать опцию col и необязательно выполнять регулярное выражение в другой группе.

Regex:^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::?(\d+))?$

Объяснение:

  • IP-адрес фиксируется в первой группе.

  • Дополнительный номер порта фиксируется во второй группе. : является частью группы, не участвующей в захвате, поэтому она не фиксируется во второй группе.

Regex101 Demo

+0

Спасибо ... Я? действительно смущен. Разумеется, это решает. Моя проверка If-statement содержит двоеточие, включенное в скобки, поэтому он задал мне вопрос :( –

+0

Технически это будет соответствовать IP-адресу с завершающим двоеточием, но без порта - «192.168.1.1:». – bipll

+0

@bipll: Обновлен мой ответ. –

2
set str 192.168.1.1:44 
lassign [split $str :] ip port 
if {$port eq ""} { 
    set port 23 
} 
puts $ip 
puts $port 

Если вам необходимо убедиться, что $ip строка является допустимым IP-адрес, то лучше использовать ip пакет, чем регулярное выражение (регулярное выражение вы будете использовать много недопустимых IP-адресов).

Обратите внимание, что у вас будет много проблем с адресами IPv6.

Документация: if, lassign, puts, set, split, ip пакет

+0

Пакет ip, вероятно, использует регулярные выражения, но он использует правильные, которые были отлажены от кучи реальной гадости тестовые примеры. –

+0

@DonalFellows: в пакете есть три вызова regexp, и они очень разумно ограничены по объему. Нет ничего плохого в regu но я считаю, что они очень часто используются небрежно и наивно. –

Смежные вопросы