【Tcl学习笔记】第5章 字符串操作

本文介绍Tcl语言中字符串处理的方法,包括字符取值、长度计算、大小写转换、字符串搜索与比较、格式化创建字符串、正则表达式匹配与替换等功能,并详细解释了各种命令的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.2 取字符:string index 和 string range

string index "hello world" 0
输出:h
string range "hello world" 6 end-1
输出:worl

  • 索引从0开始
  • end对应结尾
  • 可以使用表达式,如end-$i

5.3 长度、大小写转换、裁剪、重复

  1. 长度:string length "hello world"
    输出:11
  2. 大小写转换:string toupper "Hello World"(小写:string tolower)
    输出:HELLO WORLD
  3. 裁剪
    • 匹配两端:string trim "abcxxxcba" ab
      输出:cxxxc
    • 匹配左边:string trimleft "abcxxxcba" ab
      输出:cxxxcba
    • 匹配右边:string trimright "abcxxxcba" ab
      输出:abcxxxc
  4. 重复:string repeat "hello world" 2
    输出:hello worldhello world

5.4 简单搜索

从左到右搜索字符串中第一个wo的首字符位置,找不到返回-1:
string first wo "hello worldhello world"
输出:6
指定从索引为10的字符开始搜索:
string first wo "hello worldhello world" 10
输出:17
string last: 从右到左搜索

5.5 字符串比较

string compare "hello" "Hello"
输出:1
string compare "Hello" "hello"
输出:-1
string compare "Hello" "Hello"
输出:0
忽略大小写:string compare -nocase "Hello" "hello"
输出:0
设置比较的长度:string compare -length 1 "hELLO" "hello"
输出:0
只返回0(不相同)或1(相同):string equal -nocase -length 2 "hello" "Hexxx"
输出:1

5.6 字符串置换

  1. string replace
    string replace "hello world" 6 10 "Tcl"
    输出:hello Tcl
    • 参数 6 10被替换字符串索引的起始与结束。
    • 参数Tcl:可以省略,结果等效为删除。
  2. string map dictionary string
    将string中出现的的所有dictionary关键字置换为相应的值。
    set entities {
        action1 hello
        action2 learn
        name    Tcl
    }
    string map -nocase $entities {Action1 name,action2 name}
    
    输出:hello Tcl,learn Tcl

5.7 确定字符串类型

string is type string

类型描述
Alnum全为Unicode字母或数字
alpha全为Unicode字母
ascii全为7位ASCII字符
boolean布尔型值(0、false、no、off、1、true、yes、no)
control全为Unicode控制字符
digit全为Unicode数字
double双精度浮点(忽略前后空白字符)
false布尔型值非
graph全为非空白Unicode打印字符
integer32位整型
list一个有效的列表结构。如果结构不正确,-failindex变量会设置为列表中第一个导致结构无效的元素
lower全为Unicode小写字母
print全为Unicode打印字符(含空白)
punct全为Unicode标点符号
space全为Unicode空白符号
true布尔型值是
upper全为Unicode大写字母
wideinteger长整型
wordchar全为字母和连接符
xdigit全为16进制数

string is 命令用Unicode规定测试字符,例如 Unicode的数字字符就不止ASCII字符的0~9

5.8 用format创建字符串

Tcl的format命令提供与ANSIC库中的sprintf程序相似的功能。

format "1 + 1 = %.3f" [expr {1+1}]
输出:1 + 1 = 2.000

Tcl中format命令的重要性不如C中的printf。printf和sprintf为了把二进制数值转换为字符串,从而进行字符串替换操作。但是Tcl的值本来就以字符串存储。

常用用途:

  • 改变一个值的格式,以改善显示效果。
    format "exp(%d) %12.3f" 9 [expr exp(9)]
    输出:exp(9) 8103.084
  • 改变一个值的表现形式。数值->ASCII。
    format "int:%d ASCII:%c" 97 97
    输出:int:97 ASCII:a

5.9 用scan解析字符串

scan 待解析字符串 解析格式 存储解析结果的变量
返回完成转换的次数

% scan "name: w0shishabi, age: 22" "name: %10s, age: %f" name age
2
% set name
w0shishabi
% set age
22.0

5.10 通配符样式的模式匹配

string match命令:string match ?-nocase? pattern string

% string match w* w0shishabi
1

通配符含义:

字符说明
*零个或多个任意字符
?一个任意字符
[chars]与[chars]中的任意一个字符匹配。
\x转义符号,与单个字符x匹配

5.11 使用正则表达式进行模式匹配

  1. 分类

    1. 基本正则表达式(BRE)
    2. 拓展正则表达式(ERE)
    3. 高级正则表达式(ARE),Tcl8.1以上支持
  2. 正则表达式的原子(元字符)
    正则表达式模式的基本单位称为原子。
    正则表达式中的特殊字符:

    字符说明
    .任意单个字符
    ^指定与输入字符串开头匹配
    $指定与输入字符串结尾匹配
    \m与单词开头匹配
    \M与单词结尾匹配
    \k匹配非字母非数字的字符k
    \c转义,当c是字母或数字,用c替换\c
    [chars]chars范围:a-b。与chars中的任意单个字符匹配。如果chars第一个字符是^,则与非chars字符匹配。如果chars第一个字符是],或者~出现在chars的开头或结尾,则被当作文本处理。
    (regexp)匹配正则表达式regexp
    *与0个或多个前述原子组成的序列匹配
    +与1个或多个前述原子组成的序列匹配
    ?与空字符串或前述一个原子匹配
    {m}前述原子组成的序列匹配正好m次
    {m,}前述原子组成的序列匹配至少m次
    {m,n}前述原子组成的序列匹配至少m次,至多n次
    re1|re2|…与任意一个正则表达式匹配

    正则表达式中的字符-条目转义序列

    转义序列表示的内容
    \a铃声、警报声、字符
    \b退格
    \B反斜线\
    \cX取给定字符X的低5位,高位补0作为转义后的字符
    \e转义字符
    \f换页
    \n换行
    \r回车
    \t制表符
    \uwxyz由给定的十六进制数指定的Unicode字符
    \v垂直制表符
    \xhhh由给定的十六进制数指定的ASCII码字符
    \0空、零、字符
    \xyz由给定的两位或三位八进制数给定的ASCII码字符

    圆括号中的正则表达式组成的原子:如(a,b)

    方括号表示的范围的原子:
    1. 字符范围:如[^0-9a-fA-F]表示与不含十六进制字符的字符串匹配。
    2. 字符类型:如[:alpha:]表示全部字母。

    正则表达式中的字符类型

    类型说明
    [:alpha:]字母
    [:alnum:]字母和数字
    [:blank:]空格和制表符
    [:cntrl:]控制字符
    [:digit:]十进制数字
    [:graph:]有图形的字符,如数字、字母或标点
    [:lower:]小写字母
    [:print:][:graph:]加空白符
    [:punct:]标点符
    [:space:]空白符
    [:upper:]大写字母
    [:xdigit:]十六进制数字

    字符类型的简写
    |转义序列|表示的类型|
    |\d|[[:digit:]]|
    |\D|[1]|
    |\s|[[:space:]]|
    |\S|[2]|
    |\w|[[:alnum:]]|
    |\W|[3]|

  3. 正则表达式的分支和量词

    1. 分支
      • 正则表达式可以用操作符|连接。
      • |连接起来的正则表达式称为分支。
      • 分支可以用()括起来避免太长。
    2. 量词
      • 操作符*、+、?以及边界{}指定重复次数,称为量词。
        ^(0x)?[0-9a-fA-F]+$匹配十六进制数。
      • 量词默认是 贪婪(尽可能多的匹配) 的,后面加一个?变成非贪婪的。
  4. 逆向引用
    就是将匹配到的字符用于模式中。
    如:([ab])\1与字符串aabb匹配,与abba不匹配,因为逆向引用\1将第一个匹配到的字符ab用于模式中。

  5. 非捕获子表达式
    用于不需要对子表达式进行逆向引用或者解析的情况,特点是速度快。
    格式:(?:expression)

  6. regexp命令
    作用:调用正则表达式匹配。

    % regexp {^(0x)?[0-9a-fA-F]+$}  0x5a
    1
    

    注意:建议总是把正则表达式括在大括号中,避免出发变量替换或命令替换。

5.12使用正则表达式进行替换

`regsub 模式 字符串 替换字符串 替换后的接受字符串`  
```
% regsub there "they live there lives" their x
1
% set x
they live their lives
```

5.13 二进制字符串

命令:binary format formatString ?arg arg ...?

  • binary format命令在一个Tcl变量中创建二进制字符串。
  • formatString 由一系列字段指示符组成,可以包含分隔符,描述要格式化的数据的类型,还可能给出需要格式化的条目数(默认为1),*表示各项都要格式化。
% binary format c3 {65 66 67}
ABC

返回一个二进制字符串
字段指示符c3表示格式化3个8位有符号整数。


  1. :digit: ↩︎

  2. :space: ↩︎

  3. :alnum: ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值