我对TCL中的regexp有疑问
如何使用regexp函数在TCL字符串变量中查找和更改some text
文字示例:
/folder/folder2/test-c+a+t -test1 -test2
我想收到:
/folder/folder2/test-d+o+g
或者例如它可以只是:
test-c+a+t
我想收到:
test-d+o+g
对不起这个补充:
在这种情况下:
/test-c+a+t/folder2/test-c+a+t -test1 -test2
我想收到:
/test-c+a+t/folder2/test-d+o+g -test1 -test2
答案 0 :(得分:3)
% set old {/folder/folder2/test-c+a+t -test1 -test2}
/folder/folder2/test-c+a+t -test1 -test2
% set new [regsub {(test)-c\+a\+t.*} $old {\1-d+o+g}]
/folder/folder2/test-d+o+g
请注意,文字+
符号需要转义,因为它们是正则表达式量词。
http://tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm
http://tcl.tk/man/tcl8.5/TclCmd/regsub.htm
答案 1 :(得分:3)
在这里你提到的具体情况中,你最好使用字符串映射。正则表达式更灵活,但这完全取决于您的任务的具体程度。
set modified [string map {test-c+a+t test-d+o+g} $original]
否则,学习如何使用正则表达式语法是无可替代的。它几乎一直很有用,因此请阅读手册页,尝试各种表达式,并在不符合预期时重新阅读本手册。还可以尝试使用sed,awk和grep学习使用regexp。
答案 2 :(得分:0)
使用string map
或使用regsub
(可能使用-all
标记)。以下是两种方法的一些示例:
set myString [string map [list "test-c+a+t" "test-d+o+g"] $myString]
set myString [regsub -all "***=test-c+a+t" $myString "test-d+o+g"]
### Or equivalently, for older Tcl versions...
regsub -all "***=test-c+a+t" $myString "test-d+o+g" myString
string map
可以在一次扫描中应用多项更改(地图a b b a
会交换所有a
和b
个字符),但仅永远取代文字字符串,并始终取代它所能做的一切。 regsub
命令可以执行更复杂的转换,并且可以更加选择性地替换它,但是它确实需要使用正则表达式,而string map
可以执行等效操作时速度较慢工作。但是,模式中的特殊前导***=
表示模式的其余部分是文字字符串。