2

我有一个字符串xxxxxxx-s12345ab7_0_0_xx2.log,需要有一个像AB700_xx2TCL 一样的输出。

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

试过string trim,string trimleftstring trimright, 但没多大用处。string splitTCL有类似的东西吗?

4

3 回答 3

4

第一阶段是提取基本的相关子串;最简单的方法实际上是使用正则表达式:

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 toupperandlrange命令的作用……)

于 2013-10-21T08:50:05.940 回答
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
于 2013-10-21T09:01:58.820 回答
0

只有正则表达式就足够了。

设置字符串"xxxxxxx-s12345ab7_0_0_xx2.log"

regexp {(ab)(.*)_(.*)_(.*)_(.*)\\.} $string -> s1 s2 s3 s4 s5

设置 rstring"$s1$s2$s3$s4\_$s5"

看跌期权$rstring

于 2013-11-11T05:13:54.797 回答