一、字符串比较:string compare, string equal
我们在 expr 和控制语句如 if、while 中可用比较运算符”==”、”!” 、“=”、 “”等来进行字符串比较,但是如不注意的话就会产生问题。首先必须用双引号来将字符串值括起来,这样表达式语法分析器才能按照字符串类型来进行识别。然后必须用花括号将整个表达式括起来以阻止主解释器将双引号去掉: if {$x == “true” } {puts ok} 然而,这样的直接比较还是会带来其他意想不到的问题。比较安全的方法是使用 string compare 和 string equal 来操作,而且这些 string 命令的执行速度也更快。
下面是三个例子:if 中的条件都是判断是否相同,
注意命令返回值:string compare 在不同的情况下返回 1,相同返回 0。而 string equal 和 string match 则恰恰相反,相等或者匹配时返回 1 ,不同返回 0。
1.
>set x abc
>set y bcd
if {$x=="abc"} {
puts "ok"
} else {
puts "go"
}
=>ok
2. string equal 相同返回1
>set x abc
>set y bcd
if {[string equal $x $y] == 1} {
puts "ok"
} else {
puts "go"
}
=>go
3. string compare 相同返回0
>set x abc
set y bcd
if {[string compare $x $y] == 0} {
puts "ok"
} else {
puts "go"
}
=>go
二、字符串匹配:string match
string match 来匹配字符的结构如下:string match pattern str
为了使结果返回 1(匹配),pattern 和字符 str 必须相同,除非你是使用了匹配字符。
字符 说明
* 通配符。匹配任意数量和值的任意字符
? 匹配一个字符
[chars] 匹配 chars 中的任意一个字符,注意与正则表达式的元字符[abc] 和 [^abc]区分开
1.
>string match {[ab]*} beee
=>1
string match 支持匹配字符集。字符集要用花括号括起来以便 Tcl 正确理解方括号内是匹配模式而不是嵌套的命令。
>set x abc
>string match {[a]*} $x
=>1
也可以使用语法[x-y]来指定将要匹配的一个区段的字符。如[a-m]就表示所有从 a 到 m 的小 写字母集。一个集合也不限定一个区段:
>string match {[a-z0-9]} 6
=>1
>string match {[a-z0-9]} 66
=>0
>string match {[0-9][0-9]} 66
=>1
三、字符串替换:string replace
string replace 可以用新的字符串代替字符串中指定范围内的字符,如果没有指定新字符串,则指定范围内的字符都会被删除。另外注意:替换不改变原来字符串变量的值,只是返回 更改后的新字符串。
>string replace aaaabbbb 1 3 ccc
=>acccbbbb
>string replace aaaabbbb 1 3
=>abbbb
>set a aaabbb
>string replace $a 1 2 abbb
>puts $a
=>aaabbb ;#a 的值并没有改变
四、字符类别:string is
string is 命令用来测试一个字符串是否属于某个特定的类(class)。它对于进行参数输入合 法性检查非常有效。
比如,要确保输入参数是整数,则可以这么做:
>if {![string is integer $input]} {
error "Invalid input parameter: $input. Please enter a integer number"
}
if 语句检查输入参数 input 的值是否为 integer,如果不是则报错。 命令 string is 当正确时返回 1,不正确返回 0,”!”是逻辑非操作。error 命令和 puts 作用相 似,但 error 会终止程序。
>set input 66
>if {![string is integer $input]} {
error "ERROR"
} else {
puts "input is integer"
}
=>input is integer
五、字符串映射:string map
string map 命令根据字符映射对字符串进行转换。映射以输入、输出表的形式表示。凡是字符串中包含有输入序列的地方都使用相应的输出序列替换。输入、输出要成对使用:
>string map {f p d l} "food"
=>pool
上例命令中 {f p d l}为输入、输出表,输入、输出项成对出现:f、d 为输入,p、l 为输出,f 对应 p,而 d 对应 l。命令的结果是字符串 food 中的 f 被 p 替换,d 被 l 替换。
输入和输出项可不止一个字符而且不要求长度相同:
>string map {f pp d ll oo a} "food"
=>ppall
string map 命令和 UNIX shell 的 tr 命令比较相似。