2013-10-21 63 views
2

我有一個字符串xxxxxxx-s12345ab7_0_0_xx2.log,需要在TCL中輸出如AB700_xx2TCL字符串操作和提取

ab將是分隔符和需要提取從ab.(包括ab),並且還具有隻刪除所述第一兩個下劃線。

試過string trim,string trimleftstring trimright,但用處不大。 TCL中有什麼像string split

+1

你能解釋該字符串的結構? 'ab'分隔符總是一樣嗎? * 7 *,* 0 *,* 0 *總是單個數字嗎? * x *是任何字符*佔位符嗎? –

+1

'字符串修剪*'不是這項工作的正確工具,'string split'就是所謂的'split' ... –

回答

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命令做...)

+0

我會做'regsub -all {_(\ d)} $ extract {\ 1} final '去掉「內在」下劃線,給出或不要說出口要求。 –

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 
0

只有正則表達式就足以勝任。

組字符串"xxxxxxx-s12345ab7_0_0_xx2.log"

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

集RSTRING "$s1$s2$s3$s4\_$s5"

提出$rstring