Регулярное выражение TCL для обрезки строки из определенного специального символа

#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:

Это перехватит все, что было до :: : (.*)::

См.: https://regex101.com/r/LzqnmZ/1

Комментарии:

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 не совпадает.