TCL字符串操作

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。不过只删除右边的字符。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tcl字符串正则表达式是一种用于匹配和搜索字符串的模式。Tcl正则表达式基于1003.2规范和一些Perl5扩展。它包含一个或多个约束或量化原子的连接。正则表达式可以使用不同的风格,包括扩展正则(ERE)、基本正则(BRE)和高级正则(ARE)。Tcl实现了高级正则表达式风格,它在ERE的基础上添加了一些重要的扩展。通常,正则表达式的风格由应用程序的方法指定。如果表达式以“:”开头,则剩余的表达式为高级正则表达式(ARE)。如果以“=”开头,则其余的表达式被视为普通字符。Tcl字符串正则表达式的语法为regexp ?optionalSwitches? patterns ?searchString? fullMatch subMatch1 ... subMatchn。[1][2] BRE与ERE在几个方面有所不同。在BRE中,字符“|”、“+”和“?”只是普通字符,没有与它们的功能等价的字符。边界的分隔符是“\{”和“\}”,而“{”和“}”本身为普通字符。嵌套子表达式的括号是“\(\)”和“\(\)”和“\(\)”,而“(”和“)”本身为普通字符。除了在正则表达式或圆括号子表达式的开头以外,“^”均为普通字符。除了在正则表达式或圆括号子表达式的末尾以外,“$”均为普通字符。如果“*”出现在正则表达式或圆括号子表达式的开头(或者有一个前导字符^),则为普通字符。只能使用个位数的反向引用。除了“\<”和“\>”等价于“[[:<:]]”和“[[:>:]]”之外,没有其他转义字符可用。[3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值