字符串的长度与索引
命令string length可以获取字符串中字符的个数。string length后跟一个参数,即字符串。
命令string index可以通过索引值获取字符串指定位置的字符。string index后跟两个参数,第一个参数是字符串,第二个参数是索引值。索引值可以用数字表示(从0开始),也可以用end表示(最后一个字符的索引值为end,倒数第二个字符索引值为end-1)。
注意:当使用end±i(i为正整数)的形式表示索引值时,end±i中间不允许出现空格。
字符的索取
string range功能与string index类似,需要两个索引值,返回的是由两个索引值确定的范围内的所有字符,即返回一个子字符串。
string range后跟三个参数,第一个参数是字符串,第二个和第三个参数都是索引值。若第一个索引值大于第二个索引值,返回空字符。
字符串的添加
append可以在字符串末尾添加新的字符串,其后跟两个参数,第一个参数是变量名(对应待添加字符串的字符串),第二个参数是新的字符串。
append命令会直接修改原始变量的值,不会创建新的变量。
set str Hello
=> Hello
set v " Tcl"
=> Tcl
set str_new $str$v
=> Hello Tcl
append str $v
=> Hello Tcl
puts $str
=> Hello Tcl
字符的删除
string replace 可以删除指定索引范围内的字符。该命令后跟3个参数,第一个参数为字符串,第二个和第三个参数均为索引值。
返回值是删除索引值范围内的字符后的剩余字符。
string replace不会修改原始字符串变量的值。
字符串的替换
若string replace后跟4个参数,可以实现字符串的替换。其中,第4个参数为新的字符串,用于替换两个索引值确定的范围内的字符串。
该命令返回替换后的字符串,不会修改原始字符串。
字符串的比较
string compare接收两个字符串参数,并对其进行比较。
如果第一个字符串在字典中先于第二个字符串,则返回-1;如果第一个字符串在字典中后于第二个字符串,则返回1;如果两者相同,则返回0。
添加命令-nocase可以不区分大小写
添加命令-length i(i是正整数),可以限定支队前i个字符进行比较。
string equal命令用于判断两个字符串是否严格相等。若相等,则返回1,否则返回0。用法和string compare一致。
set str1 grey
=> grey
set str2 green
=> green
string compare $str1 $str2
=> 1
string compare $str2 $str1
=> -1
string compare Green green
=> -1
string compare -nocase Green green
=> 0
string compare -length 3 $str1 $str2
=> 0
string equal Green green
=> 0
string equal -nocase Green green
=> 0
string equal -length 3 grey green
=> 1
判断两个字符串是否严格相等,使用string equal,还可以使用“==”或者eq。从执行效率来看,string equal 和操作符eq更高效一些。
字符串的简单搜索
string first接收两个字符串参数,并在第2个字符串中从左至右搜索与第1个字符串相同的子字符串。如果找到,返回最开始找到子字符串开头字符的索引值;若找不到,返回-1。
string first可以添加第3个参数,用来指定开始搜索字符的索引值。表示从第几个字符开始搜索(从0开始)。
string last同样接收两个字符串参数,与string first不同,其在第2个字符串中从右至左搜索与第1个字符串相同的子字符串。
字符串的匹配
命令string match用于通配符样式的匹配。
通配符列表
字符 | 说明 |
* | 可与零个或多个任意字符组成的字符串匹配 |
? | 可与一个任意字符匹配 |
[chars] | 可与chars中的任意一个字符匹配。chars可以是范围表达式,如a~z、0~9、A~Z等。由范围表达式确定的范围包括边界,如[a-c],那么a/b/c中任意一个字符都可与与之匹配。 |
\x | 可与单个字符x匹配,用于指定会被特殊处理的字符,如“*”、“?”、“[]”、“\” |
注意:使用范围表达式时需要注意将模式字符串放在花括号中,否则Tcl解释器会把范围表达式中的中括号[]当做命令置换符来处理。
范围表达式可以串联使用,从而构成较为复杂的模式字符串。
set p1 {*\?}
=> *\?
string match $p1 why?
=> 1
set p2 {*bus\[[0-4]\]}
=> *bus\[[0-4]\]
set str {bus[3]}
=> bus[3]
string match $p2 $str
=> 1
格式化输出
命令format功能类似C语言中的printf。
转换符如下表所示
转换符 | 功能说明 |
d | 转换为有符号整数 |
u | 转换为无符号整数 |
o | 转换为无符号八进制数 |
x或X | 转换为无符号十六进制数 |
c | 转换为ASCII码 |
s | 无转换(Tcl中一切都是字符串) |
f | 转换为浮点数 |
e或E | 转换为科学计数形式 |
此外,还可以使用位置符号“i$”(i是整数,表示对第i个参数进行转换,参数位置的起始索引为1)。
format {%1$x} 6 15 19
=> 6
format {%2$x} 6 15 19
=> f
set i 3
=> 3
format "%$i\$x" 6 15 19
=> 13
format显示结果时,默认是右对齐。若需要左对齐,则需要添加负号,同时还可以指明字段宽度。
对于浮点数,可以设置精度
format "%s" abcd
=> abcd
format "%6s" abcd
=> abcd
format "%-6s" abcd
=> abcd
format "%0-6s" abcd
=> abcd00
format "%06s" abcd
=> 00abcd
format "%6.2f" 3.14159
=> 3.14
format "%-6.2f" 3.14159
=> 3.14
格式标志符 | 功能说明 |
- | 显示结果时左对齐 |
+ | 对于正数,显示时添加正号“+” |
0 | 在实际字符长度小于指定字段宽度时,以0填充 |
#0 | 以八进制显示时,第一个字符为0(数字0) |
#x | 以十六进制显示时,前两个字符为0x |
与字符串相关的其他命令
string totitle:将字符串转换为标题形式,即第一个字母大写
string toupper:将字符串中小写字母全部转换为大写字母
string tolower:将字符串中大写字母全部转换为小写字母
string trim:去除字符串开头和结尾处的裁剪字符
string trimleft:只去除字符串开头处的裁剪字符
string trimright:只去除字符串结尾处的裁剪字符
set str axbxxc
=> axbxxc
string trim $str abc
=> xbxx
string trimleft $str abc
=> xbxxc
string trimright $str abc
=> axbxx