您当前的位置: 首页 > 

lu-ming.xyz

暂无认证

  • 3浏览

    0关注

    115博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

lu-ming.xyz 发布时间:2021-07-27 11:09:31 ,浏览量:3

目录
  • 5.2 取字符:string index 和 string range
  • 5.3 长度、大小写转换、裁剪、重复
  • 5.4 简单搜索
  • 5.5 字符串比较
  • 5.6 字符串置换
  • 5.7 确定字符串类型
  • 5.8 用format创建字符串
  • 5.9 用scan解析字符串
  • 5.10 通配符样式的模式匹配
  • 5.11 使用正则表达式进行模式匹配
  • 5.12使用正则表达式进行替换
  • 5.13 二进制字符串

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: ↩︎

关注
打赏
1655639048
查看更多评论
立即登录/注册

微信扫码登录

0.0356s