我有一个字符串xxxxxxx-s12345ab7_0_0_xx2.log
,需要有一个像AB700_xx2
TCL 一样的输出。
ab
将是分隔符,需要从ab
to .
(包括ab
)中提取,并且还必须仅删除前两个下划线。
试过string trim
,string trimleft
和string trimright
, 但没多大用处。string split
TCL有类似的东西吗?
我有一个字符串xxxxxxx-s12345ab7_0_0_xx2.log
,需要有一个像AB700_xx2
TCL 一样的输出。
ab
将是分隔符,需要从ab
to .
(包括ab
)中提取,并且还必须仅删除前两个下划线。
试过string trim
,string trimleft
和string trimright
, 但没多大用处。string split
TCL有类似的东西吗?
第一阶段是提取基本的相关子串;最简单的方法实际上是使用正则表达式:
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
andlrange
命令的作用……)
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
只有正则表达式就足够了。
设置字符串"xxxxxxx-s12345ab7_0_0_xx2.log"
regexp {(ab)(.*)_(.*)_(.*)_(.*)\\.} $string -> s1 s2 s3 s4 s5
设置 rstring"$s1$s2$s3$s4\_$s5"
看跌期权$rstring