2017-01-24 5 views
1

У меня есть переменная, которая содержит следующие символыRegexp, чтобы соответствовать определенные символы в Tcl

"@/$% & * # {} 4g _. [] [email protected]"

Я хочу, чтобы соответствовать только "4g_.3435_.technologylte042", исключая специальные символы

Код:

set a "@\/$%&*#[](){}4g_.[][email protected]" 
regexp {[\w._-]+} $a match 
puts $match 

Я получил выход:

4g_.3435_.technology 

Я не получаю оставшиеся символы "lte042"

, пожалуйста, помогите.

+0

Заметим, что '\ w' уже включает подчеркивание - http://tcl.tk/ man/tcl8.6/TclCmd/re_syntax.htm # M68 –

ответ

2

Я полагаю, вы пытаетесь удалить все символы, отличные от слов, вместо того, чтобы пытаться найти первую непрерывную последовательность словных символов. Вы можете использовать повторный поиск и замену:

regsub -all {[^\w._-]+} $a "" match 

Другой вариант заключается в использовании -all -inline опции для создания списка совпадений вместо одного матча. Однако это приведет к пробелам между последовательными матчами. Например:

set a "@\/$%&*#[](){}4g_.[][email protected]" 
set match [regexp -all -inline {[\w._-]+} $a] 
puts $match 

==>

4g_.3435_.technology lte042 

Второй set необходимо, так как опция -inline не позволяет сочетать переменные, которые будут указаны в качестве параметров командной строки.

+0

Я проверил ваш код. Осталось @. выход был «[email protected] – gpk

+0

@gpk: Извините, пропустил« повторный »вариант,' -все'. Исправлено и протестировано. – rici

+0

Спасибо ... Это сработало ... !! Есть ли способ получить тот же результат с использованием regexp. – gpk