TCL字符串操作

2023-10-29

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCL字符串操作 的相关文章

  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https

随机推荐

  • MySQL8.0.32的安装与配置(最详细)

    目录 一 下载 打开 MySQL官网 点击打开 依次按照 P1 P4 进行下载 二 下载解压 配置初始化文件mysql ini 新建data文件夹 解压之后 解压后把文件放在C盘以外的盘 的文件里边是没有data文件的 需要 创建一个空文件
  • 【机器学习】用可视化的方式直观理解Bayesian models

    如果你感觉Bayesian models反直觉 不好理解 本期分享两个工具 利用可视化的直观方式探索贝叶斯模型 1 Python ArviZ 主要包含以下4方面功能 后验分析 posterior analysis 数据存储 data sto
  • 几款免费PDF合并成一个PDF的软件推荐,快收藏起来吧

    工作中 我们经常需要接收文件 而由于PDF文件具有较高的稳定性 所以它也成为人们发送文件的热门选择 而当需要发的PDF文件比较多时 一个个发送对方接收起来不方便也容易混乱 这时 我们将多个PDF文件合并成一个PDF文件就高效很多了 那么 P
  • umi Mock数据

    1 在mock文件夹下创建文件 export default GET api users users 1 2 api users 1 id 1 GET可忽略 POST api users create req res gt 和express
  • 如何确保网站的安全性

    大部分企业通过网站平台来进行信息发布 交流及宣传 推广企业业务 用户可以通过网站对企业进行初步的了解 并进一步获取咨询服务 企业网站不光是一个展示企业形象的平台 更是一种有效的营销方式 当然其安全性也是至关重要 随着网站的普遍应用 企业网站
  • 基于 STM32CubeMX 添加 RT-Thread 操作系统组件(四)- 多线程SRAM动态内存

    概述 本篇主要介绍这么使用STM32CubeMx工具添加RT Thread操作系统组件 码代码的IDE是keil 介绍单线程SRAM静态内存使用 如果还不知道 这么使用STM32CubeMx工具添加RT Thread操作系统组件 请移步到
  • PageRank算法 -- 从原理到实现

    本文整理自博文PageRank算法 从原理到实现 1 算法来源 这个要从搜索引擎的发展讲起 最早的搜索引擎采用的是 分类目录1的方法 即通过人工进行网页分类并整理出高质量的网站 那时 Yahoo 和国内的 hao123 就是使用的这种方法
  • Android学习笔记(五)--(可调节)模糊效果

    很多时候点开一个button的时候或者弹出某个提示的时候 背景都会变成模糊的或者说是虚化的 而今天 我们就来实现一下动态模糊效果 可以通过控制条或者手势来操控模糊程度 之前自己也做了一个 但是发现会有卡顿 在论坛逛了一会儿就发现果然有一个巧
  • 我的2020工作与学习总结

    我的2020总结 今天是2020年12月30日 马上就要开始新的一年了 在出差途中简单做个总结 总结我2020这平凡而又充实的一年 学习和生活方面 回忆起我去年做的总结我的2019 这两年都是收获满满 我19年大学毕业 其实目前我已经工作两
  • app客户端与服务器数据交互时—数据加密

    总结 1 对称加密加密与解密使用的是同样的密钥 所以速度快 但由于需要将密钥在网络传输 所以安全性不高 2 非对称加密使用了一对密钥 公钥与私钥 所以安全性高 但加密与解密速度慢 3 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密
  • vue json对象转数组_vue-vue-router 快速了解,多看看能扎实基础

    看着这么多房子头都晕了 不知道从哪里回家 概述 vue router是Vue js官方的路由插件 它和vue js是深度集成的 适合用于构建单页面应用 vue的单页面应用是基于路由和组件的 路由用于设定访问路径 并将路径和组件映射起来 传统
  • 03模板学习之函数模板案例-写一个int,char通用的冒泡

    03模板学习之函数模板案例 写一个int char通用的冒泡 1 直接看代码 模板测试 cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include
  • windows terminal使用git bash

    1 在微软应用商店下载 windows terminal 1 打开 Windows Terminnal 的设置界面 点击添加新配置文件添加配置如下 即在json配置文件中添加 commandline D Git bin bash exe l
  • ChatGPT的前世今生

    作者 符尧等 编辑 夕小瑶的卖萌屋 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 正文 最近 OpenAI的预训练模型ChatGPT给人工智能领域的研究人员留下了深刻的印
  • java中需要注意的一些代码编写规范

    一 编程规约 1 命名风格 常量命名全部大写 单词间用下划线隔开 力求语义表达完整清楚 不要嫌名字长 POJO 类中的任何布尔类型的变量 都不要加 is 前缀 否则部分框架解析会引起序列化错误 杜绝完全不规范的缩写 避免望文不知义 在常量与
  • 13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

    题目的数据来源于50道SQL练习题及参考答案 原创 Hill GM的博客 CSDN博客 sql编程题目 建表和链接里面的是一样的 解决的思路 首先将每个学生的各科成绩放在同一行显示 select st sc1 score 语文 sc2 sc
  • vue3中使用echarts的子组件接收父级传来参数,并重新渲染 +++watch监听的用法

    1 父组件页面
  • java小说摸鱼

    import org jsoup Jsoup import org jsoup nodes Document import org jsoup nodes Element import java net HttpURLConnection
  • vs编译linux内核,VSCode远程开发Linux内核驱动

    受够了Vim的换台电脑就要倒腾N天配置的折磨 受够了Windows下Source Insight眼花的界面 这些软件虽然很多人在用 但是缺点也不少 然而Linux内核代码非常庞大 编译内核又需要在Linux下进行 有没有一种能在Window
  • TCL字符串操作

    format命令 因为 TCL 把所有的输入都当作字符串看待 所以 TCL 提供了较强的字符串操作功能 TCL 中与 字符串操作有关的命令有 string format regexp regsub scan 等 语法 format form