1

我有一个包含以下字符的变量

"@/$%&*#{}4g_.[]3435_.technology@lte042"

我只想通过排除特殊字符来匹配“4g_.3435_.technologylte042”

代码:

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

我得到了输出:

4g_.3435_.technology

我没有得到剩余的字符“lte042”

请帮忙。

4

2 回答 2

3

我想您正在尝试删除所有非单词字符,而不是试图找到第一个连续的单词字符序列。您可以使用重复的搜索和替换:

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选项不允许将匹配变量指定为命令参数。

于 2017-01-24T02:07:40.417 回答
0

更近了一步:

% set s {@/$%&*#{}4g_.[]3435_.technology@lte042}
@/$%&*#{}4g_.[]3435_.technology@lte042
% join [regexp -inline -all {[][\w._-]+} $s] {}
4g_.[]3435_.technologylte042

文档: joinregexpsetTcl 正则表达式的语法

于 2017-01-24T07:04:32.300 回答