我有以下文字:
T o m ' s " b o o k "
需要转换为:
T o m' s" b o o k"
,即只要字母和特殊字符之间出现空格,就需要移除空间,保持结构的其他部分完好无损。
我的尝试:
set word "T o m ' s \" b o o k \"";
set regex "\\w\ \[\"_@:\;,.'\]"
puts $regex;
if {[regexp $regex $word]} {
regsub " " $word "" word;
}
puts $word
然而,这给了我输出:
To m ' s " b o o k "
如何更改代码以获得所需的输出?
答案 0 :(得分:2)
这可以通过regsub
轻松完成,如下所示。
set input {T o m ' s " b o o k "}
puts $input
puts [regsub -all {\s(\W)} $input {\1}]
输出
T o m ' s " b o o k "
T o m' s" b o o k"
我使用\s
来匹配空格,使用\W
来匹配特殊字符。 (即非字字符,如字母,数字或下划线以外的任何字符)
regsub
的语法如下
regsub?开关? exp string subSpec?varName?
看一下Tcl的regsub命令。在\s(\W)
之类的正则表达式中使用分组的原因是使用\1
将匹配的特殊字符重新用作后引用。
即,由模式匹配的空格和特殊字符必须由我们在原子\W
方面已经匹配的特殊字符替换。
查看here以了解Tcl
中的反向引用。