我有一個字符串xxxxxxx-s12345ab7_0_0_xx2.log
,需要在TCL中輸出如AB700_xx2
。TCL字符串操作和提取
ab
將是分隔符和需要提取從ab
到.
(包括ab
),並且還具有隻刪除所述第一兩個下劃線。
試過string trim
,string trimleft
和string trimright
,但用處不大。 TCL中有什麼像string split
?
我有一個字符串xxxxxxx-s12345ab7_0_0_xx2.log
,需要在TCL中輸出如AB700_xx2
。TCL字符串操作和提取
ab
將是分隔符和需要提取從ab
到.
(包括ab
),並且還具有隻刪除所述第一兩個下劃線。
試過string trim
,string trimleft
和string trimright
,但用處不大。 TCL中有什麼像string split
?
第一階段是提取基本的相關子字符串;做到這一點的最簡單的方法其實是用正則表達式:
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
命令做...)
我會做'regsub -all {_(\ d)} $ extract {\ 1} final '去掉「內在」下劃線,給出或不要說出口要求。 –
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
你能解釋該字符串的結構? 'ab'分隔符總是一樣嗎? * 7 *,* 0 *,* 0 *總是單個數字嗎? * x *是任何字符*佔位符嗎? –
'字符串修剪*'不是這項工作的正確工具,'string split'就是所謂的'split' ... –