2

文字列があり、TCLxxxxxxx-s12345ab7_0_0_xx2.logのような出力が必要です。AB700_xx2

ababは区切り文字であり、から.(を含む)を抽出する必要がありab、最初の 2 つのアンダースコアのみを削除する必要もあります。

string trimstring trimleftおよびを試しstring 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 toupperとコマンドが何をするかはお分かりだと思いますがlrange…)

于 2013-10-21T08:50:05.940 に答える