1

在 TCL 脚本中,我有一个带有字符串值的对象,例如:

ab_cde_12-3_xyz
def_5&6_hjk
zzz_1@234

我需要在(但不包括)最后一个“_”之前提取子字符串。

我努力了 :

regexp -all -inline {(.*)(?=_)} $my_string

但它提供了我不需要的额外垃圾。

有没有更清洁的方法来做到这一点?

谢谢,格特

4

3 回答 3

4

好的,有3种方法可以做到这一点:

  • 匹配所有内容,直到_没有其他内容_

    regexp {^(.*)_[^_]*$} $my_string -> data
    
  • 用空字符串替换最后一部分:

    regsub {_[^_]*$} $my_string {}
    
  • 获取字符串的子字符串直到最后一个_

    string range $my_string 0 [string last _ $my_string]-1
    

    这仅在字符串具有 时才有效_,否则我建议

    expr {[set pos [string last _ $my_string]] != -1
          ? [string range $my_string 0 ${pos}-1]
          : $my_string}
    
于 2013-03-22T20:02:49.067 回答
0

利用:

(.*)_[^_]*$

这是“直到 a_后跟零个或多个非_字符后跟字符串结尾的所有内容”。这确保它是最后一个下划线。

于 2013-03-22T19:10:58.663 回答
0

您实际上不需要正则表达式:列表操作会很好:

set new [join [lrange [split $my_string _] 0 end-1] _]
于 2013-03-22T23:18:50.260 回答