TCL中的Regexp在最后一个匹配字符之前解析字符串

时间:2013-03-22 19:07:57

标签: regex tcl

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

ab_cde_12-3_xyz
def_5&6_hjk
zzz_1@234

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

我试过了:

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

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

有更简洁的方法吗?

谢谢, 格特

3 个答案:

答案 0 :(得分: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}
    

答案 1 :(得分:0)

使用:

(.*)_[^_]*$

这是“一切都达到_后跟零个或多个非_字符,后跟字符串结尾。”这可以确保它是 last 下划线。

答案 2 :(得分:0)

您实际上并不需要正则表达式:list操作可以正常运行:

set new [join [lrange [split $my_string _] 0 end-1] _]