加载中…
个人资料
__one_day__
__one_day__
  • 博客等级:
  • 博客积分:0
  • 博客访问:7,301
  • 关注人气:123
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Tcl - string 字符串操作

(2014-03-21 11:32:34)
标签:

tcl

string

it

分类: unix/linux

名称

string - 操作字符串

语法

string option arg ?arg ...?

描述

根据option选项执行一个或多个字符串操作。合法的options为:
string bytelength string
返回一个十进制的字符串给出当前字符串在内存中的字节数。因为UTF-8编码使用一到三个字节表示Unicode字符,所以字节长度可能和字符长度并不相同。一个脚本一般不关心字节长度,在多数情况中可以使用string length操作(包括决定一个Tcl字节数组对象的长度)。查阅Tcl_NumUtfChars手册条目去了解关于UTF-8更多的细节。
string compare ?-nocase? ?-length int? string1 string2
逐字符对照比较字符串string1string2,返回-1、0或1。取决于string1在字典顺序上是小于、等于还是大约string2。如果指定了-length,只需要比较头length个字符,如果-length是负数则被忽略。如果指定了-nocase,字符串在比较时与大小写无关。
string equal ?-nocase? ?-length int? string1 string2
逐字符比较字符串string1和string2。如果两个字符串相同返回1,不同返回0。如果指定-length,只需要比较头length个字符,如果-length是负数则被忽略。如果指定了-nocase,字符串在比较时与大小写无关。
string first needleString haystackString ?startIndex?
搜寻在haystackString字符串中与needleString字符串完全匹配的字符段,如果找到了返回第一次匹配在haystackString字符串中的索引,如果找不到则返回-1。如果指定了startIndex则在haystackString中从索引startIndex开始搜索。例如:
string first a 0a23456789abcdef 5
将返回10,但是
string first a 0123456789abcdef 11
将返回-1
string index string charIndex
返回字符串中指定索引的字符,字符串的索引从0开始,charIndex可以由以下指定:
integer
字符串中指定索引的字符。
end
字符串最后一个字符。
end-N
字符串最后一个字符的索引减去N所得索引的字符。
end+N
字符串最后一个字符的索引加上N所得索引的字符。(N为负才有意义)
M+N
字符串中索引等于M+N的字符。
M-N
字符串中索引等于M-N的字符。

M的尾部和N的头部不能有空白,如果charIndex小于0或大于等于字符串长度则返回一个空字符串。

string is class ?-strict? ?-failindex varname? string
如果string是指定class中的成员就返回1,否则返回0。如果指定了-strict,空字符串就返回0,不指定则返回1。如果指定了-failindex,那么将导致不匹配的索引储存在varname中,如果返回1则varname不会被赋值。列举了以下字符类:
alnum
任何字母和数字字符。
alpha
任何字母。
ascii
任何ascii码(小于128位的编码)。
boolean
0、1、true、false。
control
任何控制字符(编码小于32但不是NULL的字符)。
digit
任何数字字符。
double
任何浮点字符,如果是超出浮点数范围而返回0时,vername被置为-1。
false
0、false。
graph
任何打印字符,除了空格字符。
integer
任何32位的有效整数,如果超出32位有效整数而返回0时,vername被置为-1。
list
任何列表结构。如果不是合法的列表结构就会返回0,varname内存储导致列表检查失败的元素的索引,如果不能够确认则返回-1。
lower
任何小写字母。
print
任何打印字符。
punct
任何标点符号。
space
空格符、制表符、换行符、回车、垂直制表符、退格符。
true
1、true。
upper
任何大写字母。
wideinteger
长整数,如果超过了长整数范围则返回0,vername被置为-1。
wordchar
任何字母、数字和下划线。
xdigit
任何16位进制字符([0-9][A-F][a-f])。

booleantruefalse的情况下,如果返回0,varname将被置为0。

string last needleString haystackString ?lastIndex?
搜寻在haystackString字符串中与needleString字符串完全匹配的字符段,如果找到了返回最后一次匹配在haystackString字符串中的索引,如果找不到则返回-1。如果指定了startIndex则在haystackString中只搜索到startIndex,不再向后搜索。例如:
string last a 0a23456789abcdef 15
将返回10,但是
string last a 0a23456789abcdef 9
将返回1
string length string
返回string中字符的个数。这个字符个数不是存储在string中的字节数,只有当string是个字节数组或者是个二进制编码的I/O通道时将返回字节数。
string map ?-nocase? mapping string
根据mapping表里面的key-value关系替换string中的子字符串,mapping是一个类似于key value key value …的列表,每个在string中的key都会被value替换。如果指定了-nocase,匹配就不需要考虑差别。keyvalue都可以是多字符的,置换按照一定的顺序进行,所以在列表前面的key会被优先置换。string只会被置换一次,所以前面做过置换操作的字符将不匹配后面的key。例如:
string map {abc 1 ab 2 a 3 1 0} 1abcaababcabababc
将返回01321221

如果前面的key是后面一个key的前缀,那么就会全部匹配前面的key,后面的key不会被匹配,举例如下:

string map {1 0 ab 2 a 3 abc 1} 1abcaababcabababc
将返回02c322c222c
string match ?-nocase? pattern string
如果string匹配pattern就返回1,否则返回0。如果指定了-nocase样式匹配将是迟钝模式。对于两个字符串,需要完全相同,除非在pattern中指定了下面的匹配风格:
*
匹配任何长度字符,包括空字符。
?
匹配任何一个字符。
[chars]
匹配任何给定的char字符。如果是以x-y的形式出现则匹配x到y之间的所有字符。如果指定了-nocase,范围被扩展到小写字母,比如即使“_”并不在{[A-z]}中,{[A-z]}也匹配“_”,使用了-nocase后{[A-z]}被认为是{[A-Za-z]} 。
/x
匹配单一的字符x,提供了在pattern中匹配特殊字符*?[]/的方法。
string range string first last
返回string中从firstlast指定索引范围内的所有字符。firstlast指定索引,如果first小于0则按照0来处理,如果last大于或者等于字符串长度则按照end来处理,如果first大于last则返回空字符串。
string repeat string count
返回将string重复count次的字符串。
string replace string first last ?newstring?
移除从firstlast指定索引范围内的所有字符。如果指定了newstring,此字符串将被放置在被替换字符的位置。firstlast指定索引,如果first小于0则按照0来处理,如果last大于或者等于字符串长度则按照end来处理,如果first大于last或者字符串长度,或者last小于0,则返回原字符串。
string reverse string
返回一个字符串,长度和string相同但是字符的顺序相反。
string tolower string ?first? ?last?
返回string的小写字符串。firstlast指定了进行小写转换的范围,firstlast符合索引的指定方法。
string totitle string ?first? ?last?
将第一个字符转换为Unicode的标题字符或者大写形式,而将其余的字符转换为小写形式。firstlast指定了进行小写转换的范围,firstlast符合索引的指定方法。
string toupper string ?first? ?last?
返回string的大写字符串。firstlast指定了进行小写转换的范围,firstlast符合索引的指定方法。
string trim string ?chars?
返回去掉了string开头和结尾chars字符的字符串,如果不指定chars,则空白符号将被移出(包括空格符、制表符、换行符、回车符)。
string trimleft string ?chars?
返回去掉了string开头chars字符的字符串,如果不指定chars,则空白符号将被移出(包括空格符、制表符、换行符、回车符)。
string trimright string ?chars?
返回去掉了string结尾chars字符的字符串,如果不指定chars,则空白符号将被移出(包括空格符、制表符、换行符、回车符)。
string wordend string charIndex
返回string中指定charIndex所在单词的下一个单词第一个字符的索引。构成单词的字符包括字母、数字和下划线。例如:
string wordend hhd8***3khd 1
将返回4,为第一个*的索引。(相当于hhd8为一个单词,而第一个*为另外一个单词的开始)
string wordend hhd8***3khd 4
将返回5,为第二个*的索引。(相当于第一和第二个*为两个单词,结果总是返回查找的索引所在单词的下一个单词第一个字符索引) 
string wordend hhd8***3khd 6
将返回7,为3khd的索引。
string wordstart string charIndex
返回string中指定charInde所在单词的第一个字符的索引。构成单词的字符包括字母、数字和下划线。

示例

测试字符串变量是否以非空的foobar开头。

set length [string length $string]

if {$length == 0} {

   set isPrefix 0

} else {

   set isPrefix [string equal -length $length $string "foobar"]

}

 

 

 

这里对string命令中的几个子命令使用实例进行一些解释,以便于更加容易理解string命令中的各个子命令,本文仅对三个比较复杂的命令进行实例解析。分别是is class、map和match三个子命令。
 
    string is class ?-strict? ?-failindex varname? string
    如果string是指定class中的成员就返回1,否则返回0。如果指定了-strict,空字符串就返回0,不指定则返回1。如果指定了-failindex,那么将导致不匹配的索引储存在varname中,如果返回1则varname不会被赋值。列举了以下字符类:
    判断字符串是否由字母和数字组成使用alnum:
    % string is alnum "abc123"
    1
    判断字符是否是由字母组成使用alpha:
    % string is alpha "abc"
    1
    任何ASCII码ascii:
    % string is ascii "^%*ajb1723"
    1
    布尔变量boolean:
    % string is boolean 1
    1
    % string is boolean true
    1
    在tcl8.5.1中使用这个命令,会有一点点问题,如果字符串为t、tr、tru或者f、fa、fal、fals都为真,非常奇怪的现象。
    是否是控制符号control:ASCII码中从0到37都会返回1
    % string is control "/34"
    1
    任何数字字符digit:
    % string is digit "34"
    1
    任何浮点字数double:需要注意可以带符号,但是类如.89和89.都被认为是double
    % string is double "11.2"
    1
    1或者false:(很奇怪,f、fa、fal、fals也会返回1)
    % string is false 0
    1
    打印字符,除了空格符:
    % string is graph "HelloWorld!"
    1
    % string is graph "Hello World!"
    0
    32位有效整数:(超过32位就返回0)
    % string is integer "123231232"
    1
    合法列表结构list:
    % string is list "1 32 3"
    1
    小写字母lower:
    % string is lower "abd"
    1
    任何打印字符print:与graph区别就是包含了空格符
    % string is print "a b c"
    1
    任何标点符号punct:
    % string is punct ",:"
    1
    空格符、制表符、换行符、回车、垂直制表符、退格符space:
    % string is space "/t  "
    1
    是否为真true:(包括1、true、t、tr、tru)
    % string is true 1
    1
    任何大写字母upper:
    % string is upper "HE"
    1
    长整数wideinteger:
    % string is wideinteger "1234567890123456789"
    1
    % string is integer "1234567890123456789"
    0
    任何字母、数字和下划线wordchar:
    % string is wordchar "Hi_Hi"
    1
    任何16位进制字符([0-9][A-F][a-f])xdigit:
    % string is xdigit "0123456789abcdefABCDEF"
    1
    如果指定了-strict,空字符串就返回0,不指定则返回1。
    % string is integer ""
    1
    % string is integer -strict ""
    0
    如果指定了-failindex,那么将导致不匹配的索引储存在varname中,如果返回1则varname不会被赋值。在boolean、true和false的情况下,如果返回0,varname将被置为0。
    % string is integer -failindex myIndex "1234abc"
    0
    % puts $myIndex
    4
    myIndex中的值为a的索引,因为a是第一个导致返回0的字符。
    
    string map ?-nocase? mapping string
    根据mapping表里面的key-value关系替换string中的子字符串,mapping是一个类似于key value key value …的列表,每个在string中的key都会被value替换。如果指定了-nocase,匹配就不需要考虑大小写,但是替换时完全按照替换字符的大小写进行替换。keyvalue都可以是多字符的,置换按照一定的顺序进行,所以在列表前面的key会被优先置换。string只会被置换一次,所以前面做过置换操作的字符将不匹配后面的key
    % string map "ab cd" "abababab"
    cdcdcdcd
    % string map "abc def ab gh" "abcabcababababc"
    defdefghghghdef
    匹配时忽略大小写:
    % string map -nocase "abc dEf ab gh" "ABCabcababababc"
    dEfdEfghghghdEf
    % string map "abc dEf ab gh" "ABCabcababababc"
    ABCdEfghghghdEf
    
    string match ?-nocase? pattern string
    如果string匹配pattern就返回1,否则返回0。如果指定了-nocase样式匹配将是大小写不敏感的。对于两个字符串,需要完全相同,除非在pattern中指定了下面的匹配风格:
    % string match "string match" "string match"
    1
    * 匹配任何长度字符,包括空字符。     
    匹配以string开头的字符串:
    % string match "string*" "string match"
    1
    ? 匹配任何一个字符。
    匹配string后面再有任意一个字符的字符串:
    % string match "string?" "string "
    1
    [chars] 匹配任何给定的char字符。如果是以x-y的形式出现则匹配x到y之间的所有字符。如果指定了-nocase,范围被扩展到小写字母,比如即使“_”并不在{[A-z]}中,{[A-z]}也匹配“_”,使用了-nocase后{[A-z]}被认为是{[A-Za-z]} 。
    匹配三个字母:
    % string match {[A-z][A-z][A-z]} "abc"
    1
    使用中括号时需要注意,这个符号对tcl有特殊的意义,所以需要用花括号括起来。
    /x 匹配单一的字符x,提供了在pattern中匹配特殊字符*?[]/的方法。
    需要匹配一个单一字符或者特殊字符:(如果这个字符有特殊意义就不行,比如/x匹配x但是/t就不匹配t,建议在需要匹配特殊字符再使用)
    % string match /? ?
    1

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有