0 回顾
Part0介绍了string index, string range, string trim/trimleft/trimright, string length, string toupper和string tolower等的命令。每个命令都给出了详细的实例,并且指出了场景的使用场景。忘记的同学请查看上一篇文章。string的操作内容非常的丰富,因此我们需要继续进行我们的Tcl string travel.
1 简单搜索
字符串大多数情况下对应一大串的字母+数字;人眼无法在短时间内快速的找到我们需要的字符,为此我们需要一种搜索或者查找的功能帮我们实现快速定位的需求。一般情况下,采用string first和string last实现。
string first在目标字符串中从前往后查找子字符串第一次出现的位置。如果找到,返回子字符串的起始索引(索引从0开始);如果没有找到,返回-1。命令格式如下:
string first needle_str target_str index
string first: 命令
needle_str: 要查找的子字符串
haystack_str: 被搜索的目标字符串
index: 指定开始搜索的位置,默认值为0,即从头开始搜索。
实例中采用如下字符串:
string | T | c | l | i | s | f | u | n | . | T | c | l | i | s | p | o | w | e | r | f | u | l | . | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
set str "Tcl is fun. Tcl is powerful."
# 查找 "Tcl" 第一次出现的位置
string first "Tcl" $str
# 结果:0
# 从索引3开始查找 "Tcl"
string first "Tcl" $str 3
# 结果:12
# 查找不存在的子字符串
string first "Python" $str
# 结果: -1,即没有找到
# 查找空字符串
string first "" $str
# 结果: 0(空字符串被认为存在于每个位置)
string last在目标字符串中从后往前查找子字符串最后出现的位置。如果找到,返回子字符串的起始索引(索引从0开始);如果没有找到,返回-1。和string last镜像对称。命令格式如下:
string last needle_str target_str index
string last: 命令
needle_str: 要查找的子字符串
haystack_str: 被搜索的目标字符串
index: 指定开始搜索的位置,默认值为end,即从字符串结尾始搜索。
实例中采用如下字符串:
string | T | c | l | i | s | f | u | n | . | T | c | l | i | s | p | o | w | e | r | f | u | l | . | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
set str "Tcl is fun. Tcl is powerful."
# 查找 "Tcl" 最后一次出现的位置
string last "Tcl" $str
# 结果:12
# 从索引10开始查找 "Tcl"
string last "Tcl" $str 10
# 结果:0,只能找到第一次出现的Tcl
# 查找不存在的子字符串
string last "Python" $str
# 结果: -1,即没有找到
# 查找空字符串
string last "" $str
# 结果: 26(空字符串被认为存在于每个位置)
2 字符串比较
在表达式一文中介绍了关系操作符,其中关系操作符中提及了“eq”。该关系操作符用于比较两个字符串的关系。然而,字符串单独提供了一种字符串的比较。那么两者有什么却别呢?这里做简要的描述。
str1 eq str2
1. 一般用于检查两个字符串是否完全相等(区分大小写);
2. 返回值类型为布尔值,1表示相等;0表示不相等;
3. 仅仅做相等判断,不提供顺序信息
4. 执行速度块
string compare str1 str2
1. 按字典顺序比较两个字符串(通过-nocase 区分大小写)
2. 返回值类型为整型;包括-1,0,1
3. 提供顺序信息。如-1: str1 < str2; 1:str1 > str2
4. 字符串排序的场景, ASIC flow使用较少
string copmpare的命令格式如下所示:
string compare str1 str2
其中, str1和str2是待比较的两个字符串。在比较两个字符串时,会挨个比较str1和str2每一个字符;若等于,则返回0;若大于,则返回1;若小于,则返回-1。大于和小于是根据ASIIC( 或者Unicode )码判断。如a<b; a>A。下面给出实际的案例:
string compare Michigan Minnesota
# step1: M == M
# step2: i == i
# step3: c != n
# c不等于n,并且c的Unicode字典排序前于n,因此c小于n。(个人建议从ASIIC码角度理解)
# 结果: -1
string compare Michigan Michigan
# 结果:0
string compare Minnesota Michigan
# 结果: 1
3 字符串替换
在处理report或者log时,时常需要做一些替换的工作。在这种场景下字符串的替换就排上用场了。通过我们使用命令:
string replace string1 index0 index1 string2
string replace: 命令
string1: 原始字符串
index_begin: 替换的起始位置,默认值为0
index_end: 替换的结束位置,默认值为end
string2: 替换参数,若为空,则表示删除。
下面给出有个使用案例:
string | S | a | n | D | i | e | g | o | , | C | a | l | i | f | o | r | n | i | a | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
string replace "San Diego, California" 4 8 "Francisco
# 把Diego替换成Francisco
# 结果:San Francisco, California
string map TODO