A-A+

TCL中使用正则表达式进行字符串替换命令regsub

2019年11月19日 脚本 阅读 4,777 views 次

在TCL中可以使用命令regsub通过正则表达式进行字符串替换。命令格式如下:

regsub ?switches? exp string subSpec?varName?

例如:

regsub there "They live therelives" their x

→1

regsub的第一个参数是正则表达式模式,第二个参数是输入字符串,与regexp相同。而且,与 regexp相似, regsub返回1代表字符串与模式匹配,返回0代表不匹配。它还可以把匹配的子字符串替换为指定的替换字符串,从而创建一个新的字符串。替换字符串就是 regsub的第三个参数, 最后一个参数是存放这个新的字符串的变量名。因此,在上面这个命令完成后,x的值为They live their lives。如果字符串不能与模式匹配,则会返回0,x的值为They live there lives (无论是否发生替换,都会设置这个变量)。

在正则表达式参数之前,还可以提供一个或多个选项, regexp支持的很多选项在regsub中也可用。通常regsub只进行简单的替换,替换掉输入字符串中最先出现的匹配项。然而,如果指定了-al选项, regsub就会继续查找,直到把所有的匹配项都加以替换,然后它会返回替换的次数。例如,执行以下命令:

regsub -all a ababa zz x

x的值为zzbzzbzz。如果没有-all选项,x的值为 zzbaba。

-nocase选项要求在模式中的字母原子进行匹配时不区分大小写。-start命令指定字符串中一个字符的索引,从指定字符处开始查找匹配。-line选项启动区分换行的匹配,和regexp相同。可以使用--来明确地标记命令选项结束。

如果替换字符串包含&或\0,其中的&或\0会被替换为与正则表达式相匹配的子字符串。如是\n形式的序列出现在置换字符串中(n是一个十进制数),与第n个捕获的子表达式相匹配的子字符串会替换掉这个\n.

例如,以下命令会把输入字符串中所有的a和b都写两遍。

regsub -all -- a|b axaab && x

这里它把x赋值为 aaxaaaabb。另外,以下命令会把后面有一个b而前面没有一个b的a的序列替换为一个z.

regsub –all -- (a+)(ba*) aabaabxab {z\2} x

这里ⅹ被赋值为zbaabxzb。反斜线可以用来代入有特殊含义的字符,避免解释器对它们进行特殊处理.

像前面的例子那样,把复杂的替换字符串用括号括起来是一个好办法,否则Tcl就会处理反斜线序列,由regsub接收到的替换宇符串可能就会缺少必要的反斜线了。

个人公众号“数字化设计CAX联盟”,欢迎关注,共同交流
标签:
为您推荐:

给我留言

© 坐倚北风 版权所有 严禁镜像复制 苏ICP备15034888号. 基于 Ality 主题定制 AliCMS
联系邮箱:leanwind@163.con,微信公众号:数字化设计CAX联盟

用户登录

分享到: