如何搜索正则表达式模式,但只使用TCL替换其中的一部分?

时间:2014-11-26 14:47:37

标签: regex tcl

我有以下文字:

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 "

如何更改代码以获得所需的输出?

1 个答案:

答案 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中的反向引用。