这里对string命令中的几个子命令使用实例进行一些解释,以便于更加容易理解string命令中的各个子命令,本文仅对几个比较容易掌握的相对简单的string命令进行实例解析。分别是bytelength、length、compare、equal、range、index、first和last几个子命令。
his is a tcltk
10
5
2
5
2
搜索到了This中的is
ThisThisThis
This is a TCLTK example
This is a example
elpmaxe ktlct a si sihT
this is a tcltk example
THIS IS A TCLTK EXAMPLE
This is a tcltk example
This is a tcltk example
This is a tcltk example!!
!!This is a tcltk example
15
% string wordstart "This is a tcltk example" 12
10
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 ...? 与上相反
例 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是一个变量,用来放替换后的字符串。
相关推荐
### C++ String 深入详解 #### 一、C++ 的 `std::string` 使用 **1.1 C++ `std::string` 简介** `std::string` 是 C++ 标准库中的一个类,用于处理字符串。它提供了一种更安全、更方便的方式来操作字符串数据,...
public void StartPrint(Stream streamToPrint, string streamType) { // 根据streamType区分处理方式 if (streamType == "txt") { // 从streamToPrint加载文本并设置为打印内容 } else if (streamType == ...
### jsp中HttpClient中的POST方法实例详解 #### 一、概述 在Web开发中,特别是使用JSP(Java Server Pages)进行服务器端编程时,经常需要通过HTTP客户端库(如HttpClient)来发起网络请求,包括GET和POST请求。...
### 字符串基础知识详解 #### 一、字符串概念与特性 在计算机编程中,字符串(String)是一种常用的数据类型,用于表示由一个或多个字符组成的序列。字符串在各种编程语言中都有广泛的应用,如Java、Python等。...
### String类详解 #### 一、String类简介与特点 `String`类是Java中最基础也是最常用的类之一,用于表示不可变的字符序列。它提供了丰富的字符串处理方法,能够满足大多数开发场景的需求。理解`String`类的工作...
**RxJava + RxAndroid 实例详解** RxJava是一款在Java虚拟机上运行的反应式编程库,它将异步操作和事件处理转化为一系列可管理的序列,这些序列被称为"流"。RxAndroid是RxJava的一个扩展,专门为Android平台设计,...
Java 生成随机字符串数组的实例详解是一种常见的编程任务,主要是利用Collections.sort()方法对泛型为String的List进行排序。下面是一个详细的实例详解,介绍了生成随机字符串数组的步骤和相关知识点。 知识点1:...
在C++编程领域,实例详解通常意味着通过具体的代码示例来深入理解语言特性和编程技巧。C++是一种强大且灵活的面向对象编程语言,广泛应用于系统软件、游戏开发、科学计算等多个领域。以下是对C++编程实例详解的一些...
### C++ `string` 类深入详解 #### 一、C++ 的 `string` 使用 ##### 1.1 C++ `string` 简介 在 C++ 中,`string` 类是一个非常重要的类,它提供了丰富的接口来处理字符串。与 C 语言中的字符数组不同,`string` ...
305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)...
这些方法都不会改变原始字符串,而是返回新的字符串实例。 在与数据库交互,比如SQL查询时,`string`扮演着重要角色。例如,构建SQL语句时,我们需要用到字符串连接来组合查询条件: ```csharp string name = ...
"Java面向对象编程实例详解2.txt"和"Java面向对象编程实例详解.txt"可能包含了详细的讲解和示例代码,涵盖了类的创建、对象的实例化、访问控制、构造函数、抽象类和接口、异常处理、集合框架等方面的知识。...
由于系统资源有限,同一时间只能有少量的AsyncTask实例在运行。过度使用AsyncTask可能导致应用程序崩溃或者性能下降。因此,在实际开发中,通常建议使用更高级的异步处理机制,如`IntentService`或`JobScheduler`,...
"Java 文件上传的实例详解" Java 文件上传是指在 Java 应用程序中实现文件上传功能的过程。文件上传是 Web 应用程序中非常常见的功能,例如上传头像、上传附件、上传图片等。Java 文件上传可以使用多种方法实现,...
3. `out` 对象:是一个`JspWriter`实例,用于输出响应内容。调用`out.println()`或`out.write()`方法可将数据写入到响应体。 4. `session` 对象:提供了会话管理功能,用于跟踪用户在整个网站中的状态。`session....
Java 文件的输入输出流实例详解 Java 文件的输入输出流实例详解是指在 Java 中对文件的输入输出操作的详细介绍。输入输出流是一个通道,程序可以通过这个通道读取源中的数据或将数据传送到目的地。 概念部分: ...
### Android核心技术与实例详解 #### 一、Android概述 Android是一种基于Linux内核(主要版本为2.6)的操作系统,由Google公司和开放手机联盟(Open Handset Alliance,OHA)领导及开发,主要用于移动设备。...
Android String资源文件插入值实例详解 我们在用string字符串资源文件引用的时候,有时候会遇到一串字符串要在中间插入一个值的问题, 比如 登录名: XXX,这里XXX是变化的。这时候我们可能会想到拼接。其实也可以...
实例详解JSP内置对象--request对象 request对象是JSP中的内置对象之一,它提供了访问HTTP请求信息的功能。在基于Web的开发中,request对象扮演着极其重要的角色。本文将通过实例详解request对象的使用和掌握。 一...