我有一个字符串xxxxxxx-s12345ab7_0_0_xx2.log
,需要在TCL中输出AB700_xx2
。
ab
将成为分隔符,需要从ab
提取到.
(包括ab
),并且还必须仅删除前两个下划线。
尝试string trim
,string trimleft
和string trimright
,但使用不多。 TCL中有string split
之类的内容吗?
答案 0 :(得分:3)
第一阶段是提取基本的相关子串;最简单的方法是使用正则表达式:
set inputString "xxxxxxx-s12345ab7_0_0_xx2.log"
if {![regexp {ab[^.]+} $inputString extracted]} {
error "didn't match!"
}
puts "got $extracted"
# ===> got ab7_0_0_xx2
然后,我们希望用string map
:
set final [string map {"_" ""} $extracted]
puts "got $final"
# ===> ab700xx2
嗯,不是我们想要的!我们希望保留最后一个下划线,并保留第一部分。
set pieces [split $extracted "_"]
set final [string toupper [join [lrange $pieces 0 2] ""]]_[join [lrange $pieces 3 end] "_"]
puts "got $final"
# ===> got AB700_xx2
(split
命令通过可选的记录说明符将字符串划分为“记录” - 默认为任何空白字符 - 然后我们可以使用列表操作轻松操作。join
命令相反,但在这里,我在一半上使用空记录说明符,这使得所有内容都连接在一起。我想你可以猜到string toupper
和lrange
命令的作用......)
答案 1 :(得分:0)
set a "xxxxxxx-s12345ab7_0_0_xx2.log"
set a [split $a ""]
set trig 0
set extract ""
for {set i 0} {$i < [llength $a]} {incr i} {
if {"ab" eq "[lindex $a $i][lindex $a [expr $i+1]]"} {
set trig 1
}
if {$trig == 1} {
append extract [lindex $a $i]
}
}
set extract "[string toupper [join [lrange [split [lindex [split $extract .] 0] _] 0 end-1] ""]]_[lindex [split [lindex [split $extract .] 0] _] end]"
puts $extract
答案 2 :(得分:0)
只有正则表达才足以完成这一操作。
设置字符串"xxxxxxx-s12345ab7_0_0_xx2.log"
regexp {(ab)(.*)_(.*)_(.*)_(.*)\\.} $string -> s1 s2 s3 s4 s5
设置rstring "$s1$s2$s3$s4\_$s5"
放$rstring