【问题标题】:Regexp trouble in TCLTCL 中的正则表达式问题
【发布时间】:2012-07-23 04:59:29
【问题描述】:

我对 TCL 中的正则表达式有疑问。
如何使用正则表达式函数在 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

【问题讨论】:

    标签: regex shell tcl


    【解决方案1】:
    % 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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        使用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 可以完成等效工作的情况下它会更慢。但是,模式中特殊的前导 ***= 意味着 模式的其余部分 是文字字符串。

        【讨论】:

          猜你喜欢
          • 2016-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多