#regex #tcl
#регулярное выражение #tcl
Вопрос:
Мое регулярное выражение TCL выглядит следующим образом
regexp {((d:[da-zA-Z] ))} "3001:470:8865:2E01::190:201" out
текущее значение out — это полная строка
3001:470:8865:2E01::190:201
Я хочу, чтобы строка перед ::
3001:470:8865:2E01
Ответ №1:
Вы можете сопоставлять буквенно-цифровые фрагменты символов, разделенные одним двоеточием, в начале строки:
regexp {^w (?::w )*} "3001:470:8865:2E01::190:201" out
puts $out
Вывод: 3001:470:8865:2E01
Смотрите онлайн-демонстрацию Tcl и демонстрацию регулярных выражений. Подробные сведения:
^
— начало строкиw
— одна или несколько букв, цифр или символов подчеркивания(?::w )*
— ноль или более вхождений двоеточия, а затем одна или несколько букв, цифр или символов подчеркивания.
Вы также можете рассмотреть возможность уточнения w
шаблона [dA-Za-z]
на случай, если вы хотите сопоставлять только буквы и цифры, и заменить первый w
на d
:
regexp {d (?::[dA-Za-z] )*} "3001:470:8865:2E01::190:201" out
См. эта демонстрация Tcl и это демонстрационное регулярное выражение.
Комментарии:
1. Это более точное соответствие
Ответ №2:
В качестве альтернативы, удалите ненужный материал:
regsub {::.*} "3001:470:8865:2E01::190:201" {} out
puts $out ;# ==> 3001:470:8865:2E01
Ответ №3:
Это перехватит все, что было до ::
: (.*)::
Комментарии:
1. Это работает для этого простого регулярного выражения, но обратите внимание, что регулярные выражения Tcl не являются PCRE: tcl-lang.org/man/tcl8.6/TclCmd/re_syntax.htm
Ответ №4:
Чтобы остановить RE at ::
, используйте предварительный просмотр:
regexp {.*(?=::)} "3001:470:8865:2E01::190:201" out
out
Переменная не записывается, если RE не совпадает.