TCL字符串操作和提取

时间:2013-10-21 08:02:17

标签: tcl

我有一个字符串xxxxxxx-s12345ab7_0_0_xx2.log,需要在TCL中输出AB700_xx2

ab将成为分隔符,需要从ab提取到.(包括ab),并且还必须仅删除前两个下划线。

尝试string trimstring trimleftstring trimright,但使用不多。 TCL中有string split之类的内容吗?

3 个答案:

答案 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 toupperlrange命令的作用......)

答案 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