Tcl/Tk string详解

分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

这里对string命令中的几个子命令使用实例进行一些解释,以便于更加容易理解string命令中的各个子命令,本文仅对几个比较容易掌握的相对简单的string命令进行实例解析。分别是bytelength、length、compare、equal、range、index、first和last几个子命令。

如果对这些命令还不了解,请参考:

string bytelength string

string length string

两个命令都是返回字符串string的长度。

把以上的两个命令放在一起比较,更能够显现出两个命令的区别。

bytelength是计算一个字符串的字节数,而length是计算一个字符串的长度,如果字符串为标准的ASCII码组成,那么两个命令得到的结果是相同的。例如:

% string bytelength "This is a tcltk example"

23

% string length "This is a tcltk example"

23

两者在有其它字符出现的时候就会有区别了,比如中文:

% string bytelength "这是一个tcltk示例"

23

% string length "这是一个tcltk示例"

11

一个中文为三个字节,所以造成了以上两者的区别,在使用这两个命令的时候需要注意这个不同点。

string compare ?-nocase? ?-length intstring1 string2

命令返回两个字符串比较的结果,string1的顺序比string2靠前就返回1,反之返回-1,相等返回0。

-nocase的意思就是不区分大小写,本文下同,不再累述。

-length int中的int就是需要比较的前面几个字符,本文下同,不再累述。

以下的例子比较两个字符串:

% string compare "This is a TCLTK example" "This is a tcltk example"

-1

因为ASCII码T在t之后,所以从顺序上来说后面的字符串显然在前,所以返回-1,如果把两个字符串的位置互换:

% string compare "This is a tcltk example" "This is a TCLTK example"

1

如果两个字符串相同则返回0:

% string compare "This is a tcltk example" "This is a tcltk example"

0

使用-nocase的话就不区分大小写,第一个例子:

% string compare -nocase "This is a TCLTK example" "This is a tcltk example"

0

因为不区分大小写,所以两个字符串对比结果相等。

只比较字符串的前7个字符"This is",再来使用第一个例子:

% string compare -length 7 "This is a TCLTK example" "This is a tcltk example"

0

因为前面的7个字符是相同的,所以返回0。

string equal ?-nocase? ?-length intstring1 string2

这个命令比较两个字符串是否相同。相同返回1,不同返回0。

以下的例子比较两个不同字符串:

% string equal "This is a TCLTK example" "This is a tcltk example"

-1

比较两个相同的字符串:

% string equal "This is a tcltk example" "This is a tcltk example"

0

-nocase与-length int的使用方法不再详述。

string index string charIndex

此命令的使用是string命令当中使用频率非常高的,而且也非常简单,就是取出字符串中索引为charIndex的字符。

举例如下:

% string index "This is a tcltk example" 14

k

string range string first last

命令取出字符串中索引范围为first到last的字符(包括first和last,下同)。

% string range "This is a tcltk example" 1 14
    his is a tcltk

string first needleString haystackString ?startIndex?

搜寻在haystackString字符串中与needleString字符串完全匹配的字符段,如果找到了返回第一次匹配在haystackString字符串中的索引,如果找不到则返回-1。如果指定了startIndex则在haystackString中从索引startIndex开始搜索。例如:

% string first "tcltk" "This is a tcltk example"
    10

返回的结果为字符串tcltk在字符串中第一次出现的子字符串第一个字符的索引。

指定startIndex表示从这个索引开始搜索:

% string first "is" "This is a tcltk example" 4
    5

如果不指定索引4,则会搜索到This中的is

% string first "is" "This is a tcltk example"
    2

string last needleString haystackString ?lastIndex?

与first命令相似,只是返回的是最后搜索到的匹配的字符段,lastIndex含义也有所不同,first命令中的index指定了从index往后搜索,而这里是从index往前,例如:

% string last "is" "This is a tcltk example"
    5

返回的is不是This中的is,可以指定lastIndex来表示从哪个索引开始搜索:

% string last "is" "This is a tcltk example" 3
    2

搜索到了This中的is

这里对string命令中的几个子命令使用实例进行一些解释,以便于更加容易理解string命令中的各个子命令,本文仅对以下几个string命令进行实例解析。分别是repeat、replace、reverse、tolower、totitle、toupper、trim、trimleft、trimright、wordend和wordstart几个子命令。

string repeat string count

非常简单,返回一个把string重复count次的字符串。

% string repeat "This" 3
    ThisThisThis

string replace string first last ?newstring?

也很简单,使用newstring替换string中的first到last的字符串,如果没有newstring,就是使用空代替。

% string replace "This is a tcltk example" 10 14 TCLTK
    This is a TCLTK example

如果没有newstring:

% string replace "This is a tcltk example" 10 14
    This is a  example

string reverse string

返回string的反序字符串:

% string reverse "This is a tcltk example"
    elpmaxe ktlct a si sihT

string tolower string ?first? ?last?

string totitle string ?first? ?last?

string toupper string ?first? ?last?

这三个命令放在一起,是因为三个命令的格式完全相同,只是实现了不同的操作。

将一个字符串全部变为小写形式:

% string tolower "This is a tcltk example"
    this is a tcltk example

将一个字符串全部变为大写形式:

% string toupper "This is a tcltk example"
    THIS IS A TCLTK EXAMPLE

将一个字符串里面开头的第一个字母转换为大写形式,其他字符转化为小写形式:

% string totitle "this is a TCLTK example"
    This is a tcltk example

first和last指定了转换的范围,操作与上述完全相同,只是对字符串的作用范围不同。

string trim string ?chars?

string trimleft string ?chars?

string trimright string ?chars?

这三个命令实现的功能类似,都是去掉chars字符,只是操作的位置有所区别。如果没有指定chars字符,则去掉空白符(包括空格符、制表符、换行符、回车符)。trim对字符串开头和结尾都操作,trimleft只对字符串开头操作,trimright只对字符串结尾操作。

% string trim "!!This is a tcltk example!!" !
    This is a tcltk example

% string trimleft "!!This is a tcltk example!!" !
    This is a tcltk example!!

% string trimright "!!This is a tcltk example!!" !
    !!This is a tcltk example

string wordend string charIndex

string wordstart string charIndex

这两个命令类似,wordend是找出给定索引的字符所在的单词的下一个单词的第一个字符的索引,wordstart是找出给定索引的字符所在的单词的第一个字符的索引。用语言描述比较难理解,下面举例说明就非常清晰了:

% string wordend "This is a tcltk example" 12
    15

12索引为tcltk中的l字符,那么返回的结果就是l所在的词tcltk的下一个词example中的第一个字符e的索引,即15。
    % string wordstart "This is a tcltk example" 12
    10

12索引为tcltk中的l字符,那么返回的结果就是l所在的词的第一个字符t的索引,即10。

---------------------------

教材:陈涛.Tcl 编程初步 tcl/tk入门经典

1.几个有用的命令
append              将值追加到字符串尾

format               字符串格式

scan                  字符串分解

binary                二进制字符串操作

string options    字符串操作和命令集

subst                 字符替代(替代特殊字符)

regexp               正则表达式(用于字符串模式匹配)

regsub               用正则表达式进行字符串模式匹配和替换

2.append 变量1 $变量2 将变量2的值追加到变量1的未尾。

3.format
与C 语言中的 printf 和 sprintf 函数的格式功能类似。

format spec value1 value2 ...
spec为格式说明字符串,valuex不变元,每个变元最多有6个关键词:位置说明符、标志、字段宽度、精度、长度和转换符。
格式转换符与C类似,格式标志符:"-"表示左对齐,"+"右对齐,“space”在数字前没有前导符时,加一个空格,"0"用0补空白,前导o为八进制,x为十六进制。

位置说明符i$表示从第i个变元取数值,从1开始。

例:set res [format "%2\$s" 1 5 9]   取第二个变元的值5。

format "%o" 20;       8进制输出20,结果为24

format "%x" 20;       16进制输出20,结果为14

format "%8x" 20;   16进制输出20,宽8位,右对齐,结果为——————14,“—”表示空格

format "%08x" 20; 16进制输出20,宽8位,右对齐,左补0,结果为00000014

format "%-8x" 20;  16进制输出20,宽8位,左对齐

format "%#x" 20;  16进制输出20,前缀为0x,结果是0x14

format "%#8x" 20;16进制输出20,前缀为0x,结果是0x00000014

format %c%e%c 40 30000 41;结果是(3.000000e+04),40和41的ASCII码为"("和")",%e是科学记数法

4.scan string format var? var? ....

与format相反,scan根据格式描述符来解析一个字符串并将对应值赋给后面的变量,返回成功转换的个数,如果没有指定输出变量则返回成功解析的结果。string是待解析的字符串,第二个是控制解析方式的格式字符串, 后面的参数用来存储转换出的值。

例 scan "16 units,24.2% margin" "%d units,%f" a b;  结果是2 ;同时a = 16,b = 24.2

该操作同时扫描string和格式,除了被忽略的空格和制表符及% 字符,格式必须和字符串中的字符一一对应,上个例子中,16对应了%d,units,对应units, 24.2对应%f,格式不匹配的字符解析将失败。

有时候空格、制表符不能被忽略,如格式为%c时,%c是将string中的相应字符转换为整型。

例 scan "a%2" "%c%c%c" a b c;运行结果为3,表示成功转换了3个结果;a b c的值分别是97 37 51。

5.scan的几个常见用途

一是简单地解析字符串,上一小节中第一例这样的例子

二是将ASCII字符转换成对应的整型数字,上小节第二例如是

三是将可能是0开头的数字组成的字符串转换为整型数字

例 proc forceDecimal {x} {

set count [scan $x {%lld %c} n c]

if {$count != 1} {

error "not an interger"

}

return $n

}

set val 0987

expr { [forceDecimal $val + 1]}

运行结果是988,如果没有调用forceDecimal 函数,而是expr {$val + 1};则会报错。%lld支持无限精度,可存储任意大小的整数。

6.binary

对于数值来说,二进制(这里说的二进制是数据在机器中的存储方式,后面所说的八进制等只是表现形式)可能比ASCII码更省存储空间,tcl提供了数字的ASCII码和n进制码的转换:

binary format spec value1 ?value2 ...?  将数值类型转换为ASCII
binary scan string spec var1 ?var2 ...?  与上相反

spec 为格式描述字符串

例 set b [binary format "s" 25664] ; 将整型数25664(在内存中占4位)转换成字符串“25664”(在内中占5位),运行结果是"@d"。

25664的二进制表示是0110,0100,0100,0000,高8位是100,对应ASCII为"d",低8位是64,对应"@"

小写的s是从低位开始排列,所以结果是"@d"。

binary scan "@d" "s" var; 执行后puts $var的结果是25664

这里的格式字符前没有加"%",下面列出二进制转换的格式字符

类型                              说明
 a              包含 count 个字符的字符串。在 binary format 中以空字符作为补白
 A              和 a 功能相同,只不过使用空格符而不是空字符作为补白。
 b              长度为 count 的二进制字符串,以 0 和 1 组成,按照从低到高的 bit 位顺序排列
 B              长度为 count 的二进制字符串,以 0 和 1 组成,按照从高到低的 bit 位顺序排列
 h              长度为 count 的十六进制字符串,按照从低到高的字节顺序组成
 H              长度为 count 的十六进制字符串,按照从高到低的字节顺序组成
 c               一个 8 位字符编码。binary scan 中会从字符串中将字符转换为对应整数
 s               字节顺序为 little-endian 的 16 位整数。count 用于指定重复特性
 S              字节顺序为 big-endian 的 16 位整数。count 用于指定重复特性
 i               字节顺序为 little-endian 的 32 位整数。count 用于指定重复特性
 I               字节顺序为 big-endian 的 32 位整数。count 用于指定重复特性
 f               本机格式的单精度浮点数。count 用于指定重复特性
 d              本机格式的双精度浮点数。count 用于指定重复特性
 x              使用 binary format 放置 count 个空字节。使用 binary scan 跳过 count 个字节
 X              回退 count 个字节
 @             跳到由 count 指定的绝对位置。如果 count 为*则跳到末尾

有些字符在终端居然显示不出来,比如224对应的ASCII字符,通常显示成个这"" !?

7.subst

{}中的$,\,[,]等符是不做替换的,但需要替换的时候也可以用subst实现

set a hello!

subst [{a = $a}]  运行结果是a = hello!

如果改成:subst {[puts {a = $a}]b = $a}; 结果就是a = $a b = hello!;理解是,解析器解析的时候,先将{a = $a}传递给了puts命令,puts命令执行完全后,再将结果a = $a 和后面的字符串b = $a 传递给subst,因为解析器不对结果进行第二次解析,所以a = $a这里不进行替换。

8.从字符串中获取字符 string index 和string range

string index string n; 获取string的第n个字符,从0开始算

例 string index "Sample string" 3; 结果是p。

string range string n1 n2;获取string的第n1到n2个字符

例 string range "Sample string" 3 9;结果是“ple str”。

9.长度 string length 大小写转换 string toupper /string tolower

例 string length "Sample string"; 结果是13

例 string toupper "Sample string";结果是"SAMPLE STRING".

10.剪裁 string trim 、string trimleft、string trimright

例 string trim aaxxxabad abc; 从左右开始,去掉字符串两边在“abc”中出现的任意字符,直到遇到不属于“abc”的字符为止。

trimleft、trimright和trim类似,不过一个是去掉左边的,一个是去掉右这的

11.简单搜索 string first、string last

例 string first wh "I do not know where he is now."; 查找"wh"第一次出现的位置,结果是14。

例 string last wh "I do not know where he is now. who ?"; 查找"wh"最后一次出现的位置,结果是31。

12.字符串比较string compare 、string equal

例 string compare Michigan Minnesota;结果是-1。如果第一个字符串在字典中先于第二个字符串,返回-1,反之返回1,如果两字符串相同则返回0

string equal 判断两字符串是否相同,如果是则返回1,否则为0

13.字符串置换 string replace

例 string replace "San Diego, California" 4 8 "Francisco"; 将字符串的4到8替换成"Francisco"。

14.判断字符串类型 string is

例 string is digit 125; 结果是1

例 if {![string is integer $input]} {
          error "Invalid input parameter: $input. Please enter a integer number"
    }

该命令支持的字符类型有

字符类                          说明

alnum              任何字母或数字字符

alpha               任何字母字符

ascii                 任何具有 7 位字符编码的字符(即,小于 128)

boolean            0,1,true,false(不分大小写)

control             字符编码小于 32 而又不是 NULL 的字符

digit                 任何数字字符

double             有效浮点数

false                 0,false(不分大小写)

graph               不包含空格字符在内的任何打印字符

integer             有效整数

lower                全为小写的字符串

print                 alnum 的同义词

punct               任何标点符号

space              空格符、制表符、换行符、回车、垂直制表、退格符

true                 1、true(不分大小写)

upper              全为大写的字符串

wordchar         字母、数字和下划线

16.字符串映射(匹配)

tcl有两种模式匹配, 一种是简单的"通配符"样式,一种是正则表达式

string match实现了通配符样式的匹配

string match ?-nocase? 模式 string ;??表示可选,-nocase表示忽略大小写,常用的通配符与C类似,*表示任意字符串,?表示任意的一个字符,

[chars]表示与chars中的任意一个字符匹配,\char用来匹配单个字符,也可用来匹配*,?,[]等特殊字符。

例 string match a* Abc;结果为0,表示不匹配

string match a* -nocase Abc;结果为1,表示匹配

string match {[ab]*} bac;结果为1

string match {*\?} "Wow!";结果为0,找不到?

string match {*\?} "Wow?";结果为1

通配符样式的模式可以匹配很多简单的任务,例如*.[ch]可以用来匹配所有以.c和.h结尾的字符串。但无法法完成一些复杂的任务,例如

检测一个字符串是否凶信了所有的数字,用[1-9]只能匹配单个的数字。

17.调用正则表达式匹配 regexp

例 regexp {^[0-9]+$} 125sub330;"^+$"是从头到尾,这个语句检查字符串是否全部由数字组成。

18.匹配并替换 regsub

例 regsub there "they live there lives" their str; 第一个参数是正则表达式模式,第二个是待检测的字符串,与regexp相同,返回1代表匹配,

0代表不匹配,但regsub还要将匹配的部分用第三个参数"their"替换,第四个参数str是一个变量,用来放替换后的字符串。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

原文地址:https://www.cnblogs.com/sownchz/p/10500270.html

时间: 2024-11-09 03:08:57

Tcl/Tk string详解的相关文章

tcl/tk实例详解——返回一个文件夹下所有文件的绝对路径

http://blog.csdn.net/dulixin/article/details/2133840 #所有代码如下,使用注释的方式讲解脚本#修改好文件夹和保存结果路径,可以把本文件直接拷贝进tcl解释器运行 #脚本目的:返回一个文件夹下所有的文件的绝对路径#主要讲述和操作的命令cd.pwd.glob#次要命令:file.open.catch #脚本思想:使用递归返回所有的文件路径,可以遍历到所有的子文件夹 #脚本以在window目录下为例,需要在其它系统下请修改路径名#需要返回文件路径的文

tcl/tk实例详解——修改目录下所有文件(使用一个字符串代替另外一个)

#假设目录下全部都是普通文件,如果目录下还有子目录请#参考文章"读取文件夹下所有文件返回路径",#http://blog.csdn.net/dulixin/archive/2008/02/29/2133840.aspx##此脚本的方法主要应用于处理大批量中小文件##主要使用命令:open.string map.read###mydir:需要修改的文件所在目录#str1:被替换的字符串#str2:替换的字符串 set mydir "C:/test"set str1 &

HUD5282 Senior's String 详解(使用DP解决组合数学)

题意:假设两个字符串的最长公共子序列长度为L,求第一个字符串中有多少个长度为L的子序列是第二个字符串的子序列.显然找出一个字符串的所有长度为L的子序列是组合数学问题,如果枚举所有子串的时间复杂度是n! 级的.这里就需要用动态规划来解决.首先用dp[i][j]和num[i][j]分别记录x的前I个字母和y的前j 个字母的最长公共子序列的长度和个数.先求出dp, 然后求num:.求num[i][j]分为两种情况,子序列不选x[i]和选x[i]: 1. 不选x[i]: 如果dp[i][j] == dp

C++ string详解【转】

1.声明一个C++字符串 2.字符串操作函数 2.1 C++字符串和C字符串的转换 2.2 大小和容量函数 2.3元素存取 2.4比较函数 2.5 更改内容 插入(insert).删除(erase).替换(replace).增加字符 2.6提取子串和字符串连接 2.7输入输出操作 2.8搜索与查找 C++ string详解 Nicolai M.Josuttis 译者: 侯捷/孟岩 C++之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否

[读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析

前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下的问题, 刚好自己之前也看过类似的问题, 于是便拿出来记录一下.本文内容: 参数传递问题剖析, string与stringbuilder详解 1,参数传递问题剖析 对于C#中的参数传递,根据参数的类型可以分为四类: 值类型参数的按值传递 引用类型参数的按值传递 值类型参数的按引用传递 引用类型参数的

【Java的String详解】

Java的String类在开发时经常都会被使用到,由此可见String的重要性.经过这次认真仔细的学习了java的String类.发现了自己以前开发中对String使用的不足,特写此博客来记录自己对String的学习总结. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. String实际上是使用字符数组来存储的数据的.从源码可以清晰看到定义的字符数组. Stri

JAVA: String详解

String 类用来存储字符串 ,是不可变的. 1. 基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2. 复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.用 str.equals(str2) 方法来比较字符串的值是否相等. 3. len

C++中的string详解

标准库类型string表示可变长的字符序列,为了在程序中使用string类型,我们必须包含头文件: #include <string>  声明一个字符串 声明一个字符串有很多种方式,具体如下: 1 string s;//调用默认构造函数,s为一个空字符串 2 string s(str);//等价于string s = str;调用拷贝构造函数,s是str的备份 3 string s(str,strindex);//将字符串str内始于strindex位置的部分当作s的初始值 4 eg.stri

C++ string详解

转载至http://www.renfei.org/blog/introduction-to-cpp-string.html 运算符重载 + 和 +=:连接字符串 =:字符串赋值 >.>=.< 和 <=:字符串比较(例如a < b, aa < ab) ==.!=:比较字符串 <<.>>:输出.输入字符串 注意:使用重载的运算符 + 时,必须保证前两个操作数至少有一个为 string 类型.例如,下面的写法是不合法的: #include <io