TCL ---字符串操作_part1

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,即从头开始搜索。
实例中采用如下字符串:

stringTclisfun.Tclispowerful.
index0123456789101112131415161718192021222324252627
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,即从字符串结尾始搜索。
实例中采用如下字符串:

stringTclisfun.Tclispowerful.
index0123456789101112131415161718192021222324252627
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: 替换参数,若为空,则表示删除。
下面给出有个使用案例:

stringSanDiego,California
index01234567891011121314151617181920
string replace "San Diego, California" 4 8 "Francisco
# 把Diego替换成Francisco
# 结果:San Francisco, California

string map TODO