Регулярное выражение для соответствия определенным символам в tcl
У меня есть переменная, которая содержит следующие символы
"@/$%&*#{}4g_.[]3435_.technology@lte042"
Я хочу сопоставить только "4g_.3435_.technologylte042", исключив специальные символы
Код:
set a "@\/$%&*#[](){}4g_.[]3435_.technology@lte042"
regexp {[\w._-]+} $a match
puts $match
Я получил вывод:
4g_.3435_.technology
Я не получаю оставшихся символов "lte042"
пожалуйста помоги.
2 ответа
Я полагаю, вы пытаетесь удалить все несловарные символы, а не пытаетесь найти первую непрерывную последовательность символов слова. Вы можете использовать повторный поиск и замену:
regsub -all {[^\w._-]+} $a "" match
Другой вариант заключается в использовании -all -inline
варианты для создания списка совпадений вместо одного совпадения. Однако это приведет к пробелам между последовательными совпадениями. Например:
set a "@\/$%&*#[](){}4g_.[]3435_.technology@lte042"
set match [regexp -all -inline {[\w._-]+} $a]
puts $match
==>
4g_.3435_.technology lte042
Второй set
необходимо, потому что -inline
опция не позволяет указывать совпадающие переменные в качестве параметров команды.
На один шаг ближе:
% set s {@/$%&*#{}4g_.[]3435_.technology@lte042}
@/$%&*#{}4g_.[]3435_.technology@lte042
% join [regexp -inline -all {[][\w._-]+} $s] {}
4g_.[]3435_.technologylte042
Документация: объединение, регулярное выражение, набор, синтаксис регулярных выражений Tcl