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