Регулярное выражение для соответствия определенным символам в 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

Другие вопросы по тегам