在TCL脚本中,我有一个字符串值为的对象:
ab_cde_12-3_xyz
def_5&6_hjk
zzz_1@234
我需要在(但不包括)最后一个'_'之前提取子串。
我试过了:
regexp -all -inline {(.*)(?=_)} $my_string
但它提供了额外的垃圾,我不需要。
有更简洁的方法吗?
谢谢, 格特
答案 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] _]