format命令
因为 TCL 把所有的输入都当作字符串看待,所以 TCL 提供了较强的字符串操作功能,TCL 中与 字符串操作有关的命令有:string、format、regexp、regsub、scan 等。
语法:format formatstring ?vlue value...?
format 命令类似于 ANSIC 中的 sprintf 函数和 MFC 中 CString 类提供的 Format 成员函数。 它按 formatstring 提供的格式,把各个 value 的值组合到 formatstring 中形成一个新字符串, 并返回。例如:
%set name john
输出:John
%set age 20
输出:20
%set msg [format "%s is %d years old" $name $age]
输出:john is 20 years old
scan命令
语法:scan string format varName ?varName ...?
scan 命令可以认为是 format 命令的逆,其功能类似于 ANSI C 中的 sscanf 函数。它按 format 提供的格式分析 string 字符串,然后把结果存到变量 varName 中,注意除了空格和 TAB 键之 外,string 和 format 中的字符和'%'必须匹配。例如:
% scan "some 26 34" "some %d %d" a b
输出:2
% set a
输出:26
% set b
输出:34
% scan "12.34.56.78" "%d.%d.%d.%d" c d e f
输出:4
% puts [format "the value of c is %d,d is %d,e is %d ,f is %d" $c $d $e $f]
输出:the value of c is 12,d is 34,e is 56 ,f is 78
scan 命令的返回值是匹配的变量个数。而且,我们发现,如果变量 varName 不存在的话,TCL 会自动声明该变量。
regexp命令
语法:regexp ?switchs? ?--? exp string ?matchVar?\ ?subMatchVar subMatchVar...?
regexp 命令用于判断正规表达式 exp 是否全部或部分匹配字符串 string,匹配返回 1,否则 0。
在正规表达式中,一些字符具有特殊的含义,下表一一列出,并给予了解释。
下面的一个例子是从《Tcl and Tk ToolKit》中摘下来的,下面进行说明:
^((0x)?[0-9a-fA-F]+|[0-9]+)$
这个正规表达式匹配任何十六进制或十进制的整数。
两个正规表达式以|分开(0x)?[0-9a-fA-F]+和[0-9]+,表示可以匹配其中的任何一个,事实 上前者匹配十六进制,后者匹配的十进制。
^表示必须从头进行匹配,从而上述正规表达式不匹配 jk12 之类不是以 0x 或数字开头的串。
$表示必须从末尾开始匹配,从而上述正规表达式不匹配 12jk 之类不是数字或 a-fA-F 结尾的 串。
下面以(0x)?[0-9a-fA-F]+ 进行说明,(0x)表示 0x 一起作为一项,?表示前一项(0x)可以出 现 0 次或多次,[0-9a-fA-F]表示可以是任意 0 到 9 之间的单个数字或 a 到 f 或 A 到 F 之间的 单个字母,+表示象前面那样的单个数字或字母可以重复出现一次或多次。
% regexp {^((0x)?[0-9a-fA-F]+|[0-9]+)$} ab
输出:1
% regexp {^((0x)?[0-9a-fA-F]+|[0-9]+)$} 0xabcd
输出:1
% regexp {^((0x)?[0-9a-fA-F]+|[0-9]+)$} 12345
输出:1
% regexp {^((0x)?[0-9a-fA-F]+|[0-9]+)$} 123j
输出:0
如果 regexp 命令后面有参数 matchVar 和 subMatchVar,则所有的参数被当作变量名,如果 变量不存在,就会被生成。 regexp 把匹配整个正规表达式的子字符串赋给第一个变量,匹配 正规表达式的最左边的子表达式的子字符串赋给第二个变量,依次类推,例如:
% regexp { ([0-9]+) *([a-z]+)} " there is 100 apples" total num word
1
% puts " $total ,$num,$word"
100 apples ,100,apples
regexp 可以设置一些开关(switchs〕,来控制匹配结果:
regsub命令
语法:regsub ?switchs? exp string subSpec varname
regsub 的第一个参数是一个整个表达式,第二个参数是一个输入字符串,这一点和 regexp 命 令完全一样,也是当匹配时返回 1,否则返回 0。不过 regsub 用第三个参数的值来替换字符串 string 中和正规表达式匹配的部分,第四个参数被认为是一个变量,替换后的字符串存入这个 变量中。例如:
% regsub there "They live there lives " their x
1
% puts $x
They live their lives
这里 there 被用 their 替换了。
regsub 命令也有几个开关(switchs):
-nocase 意义同 regexp 命令中。
-all 没有这个开关时,regsub 只替换第一个匹配,有了这个开关,regsub 将把所有匹配的地 方全部替换。
-- 意义同 regexp 命令中。
string命令
string 命令的语法:string option arg ?arg...?
string 命令具有强大的操作字符串的功能,其中的 option 选项多达 20 个。下面介绍其中常用 的部分。
1、string compare ?-nocase? ?-length int? string1 string2
把字符串 string1 和 string2 进行比较,返回值为-1、0 或 1,分别对应 string1 小于、等于或大 于 string2。如果有 -length 参数,那么只比较前 int 个字符,如果 int 为负数,那么这个参 数被忽略。 如果有 -nocase 参数,那么比较时不区分大小写。
2、string equal ?-nocase? ?-length int? string1 string2
把字符串 string1 和 string2 进行比较,如果两者相同,返回值为 1,否则返回 0。其他参数与 8.5.1 同。
3、string first string1 string2 ?startindex?
在 string2 中从头查找与 string1 匹配的字符序列,如果找到,那么就返回匹配的第一个字母 所在的位置(0-based)。如果没有找到,那么返回-1。如果给出了 startindex 变量,那么将从 startindex 处开始查找。例如:
% string first ab defabc
输出:3
% string first ab defabc 4
输出:-1
4、string index string charIndex
返回 string 中第 charIndex 个字符(0-based)。charIndex 可以是下面的值:
整数 n: 字符串中第 n 个字符(0-based)
end : 最后一个字符
end-整数 n:倒数第 n 个字符。string index "abcd" end-1 返回字符'c'
如果 charIndex 小于 0,或者大于字符串 string 的长度,那么返回空。
例如:
% string index abcdef 2
输出:c
% string index abcdef end-2
输出:d
5、string last string1 string2 ?startindex?
参照 3.唯一的区别是从后往前查找
6、string length string
返回字符串 string 的长度.
7、string match ?-nocase? pattern string
如果 pattern 匹配 string,那么返回 1,否则返回 0.如果有-nocase 参数,那么就不区分大小写.
在 pattern 中可以使用通配符:
* 匹配 string 中的任意长的任意字符串,包括空字符串.
? 匹配 string 中任意单个字符
[chars] 匹配字符集合 chars 中给出的任意字符,其中可以使用 A-Z 这种形式
\x 匹配单个字符 x,使用'\'是为了让 x 可以为字符*,-,[,].
例子:
% string match * abcdef
输出:1
% string match a* abcdef 1 string match a?cdef abcdef
输出:1
% string match {a[b-f]cdef} abcdef //注意一定药用'{',否则 TCL 解释器会把 b-f 当作命 令名
输出:1 //从而导致错误
% string match {a[b-f]cdef} accdef
输出:1
8、string range string first last
返回字符串 string 中从第 first 个到第 last 个字符的子字符串(0-based)。如果 first<0,那么 first 被看作 0,如果 last 大于或等于字符串的长度,那么 last 被看作 end,如果 first 比 last 大,那么返回空。
9、string repeat string count
返回值为:重复了 string 字符串 count 次的字符串。例如:
% string repeat "abc" 2
输出:abcabc
10、string replace string first last ?newstring?
返回值为:从字符串 string 中删除了第 first 到第 last 个字符(0-based)的字符串,如果给出 了 newstring 变量,那么就用 newstring 替换从第 first 到第 last 个字符。如果 first<0,那 么 first 被看作 0,如果 last 大于或等于字符串的长度,那么 last 被看作 end,如果 first 比 last 大或者大于字符串 string 的长度或者 last 小于 0,那么原封不动的返回 string 。
11、string tolower string ?first? ?last?
返回值为:把字符串 string 转换成小写后的字符串,如果给出了 first 和 last 变量,就只转换 first 和 last 之间的字符。
12、string toupper string ?first? ?last?
同 11。转换成大写。
13、string trim string ?chars?
返回值为:从 string 字符串的首尾删除掉了字符集合 chars 中的字符后的字符串。如果没有给出 chars,那么将删除掉 spaces、tabs、newlines、carriage returns 这些字符。例如:
% string trim "abcde" {a d e}
输出:bc
% string trim " def
> "
def
14、string trimleft string ?chars?
同 13。不过只删除左边的字符。
15、string trimright string ?chars?
同 13。不过只删除右边的字符。