0

我对 TCL 中的正则表达式有疑问。
我如何some text使用正则表达式函数查找和更改 TCL 字符串变量。
文本示例: /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

4

3 回答 3

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

于 2012-07-20T10:49:40.687 回答
3

在您在此处提到的特定情况下,您最好使用字符串映射。正则表达式更灵活,所以这完全取决于您的任务的具体程度。

set modified [string map {test-c+a+t test-d+o+g} $original]

否则,学习如何使用正则表达式语法是无可替代的。它几乎一直很有用,因此请阅读手册页,尝试各种表达方式,并在您未能达到预期时重新阅读手册。还可以尝试 sed、awk 和 grep 来学习使用正则表达式。

于 2012-07-20T10:57:18.907 回答
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将交换所有ab字符),但它只替换文字字符串并且总是替换它可以替换的所有内容。该regsub命令可以进行更复杂的转换,并且可以更有选择性地替换它,但它确实需要您使用正则表达式,并且在 astring map可以完成等效工作的情况下它会更慢。但是,模式中的特殊前导***=意味着模式的其余部分是文字字符串。

于 2012-07-22T20:59:29.270 回答