在 TCL 脚本中,我有一个带有字符串值的对象,例如:
ab_cde_12-3_xyz
def_5&6_hjk
zzz_1@234
我需要在(但不包括)最后一个“_”之前提取子字符串。
我努力了 :
regexp -all -inline {(.*)(?=_)} $my_string
但它提供了我不需要的额外垃圾。
有没有更清洁的方法来做到这一点?
谢谢,格特
好的,有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}
利用:
(.*)_[^_]*$
这是“直到 a_
后跟零个或多个非_
字符后跟字符串结尾的所有内容”。这确保它是最后一个下划线。
您实际上不需要正则表达式:列表操作会很好:
set new [join [lrange [split $my_string _] 0 end-1] _]