文字列があり、TCLxxxxxxx-s12345ab7_0_0_xx2.logのような出力が必要です。AB700_xx2
ababは区切り文字であり、から.(を含む)を抽出する必要がありab、最初の 2 つのアンダースコアのみを削除する必要もあります。
string trim、string trimleftおよびを試しstring trimrightましたが、あまり役に立ちませんでした。string splitTCLのようなものはありますか?
文字列があり、TCLxxxxxxx-s12345ab7_0_0_xx2.logのような出力が必要です。AB700_xx2
ababは区切り文字であり、から.(を含む)を抽出する必要がありab、最初の 2 つのアンダースコアのみを削除する必要もあります。
string trim、string trimleftおよびを試しstring trimrightましたが、あまり役に立ちませんでした。string splitTCLのようなものはありますか?
最初の段階は、基本的な関連部分文字列を抽出することです。これを行う最も簡単な方法は、実際には正規表現を使用することです。
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…)