1

TCL スクリプトには、次のような文字列値を持つオブジェクトがあります。

ab_cde_12-3_xyz
def_5&6_hjk
zzz_1@234

最後の '_' の前 (ただし、含まない) の部分文字列を抽出する必要があります。

私が試してみました :

regexp -all -inline {(.*)(?=_)} $my_string

しかし、それは私が必要としない余分なゴミを与えます。

これを行うためのよりクリーンな方法はありますか?

ありがとう、ゲルト

4

3 に答える 3

4

わかりました、それを行うには3つの方法があります:

  • _other が続かなくなるまで、すべてに一致します_

    regexp {^(.*)_[^_]*$} $my_string -> data
    
  • 最後の部分を空の文字列に置き換えます。

    regsub {_[^_]*$} $my_string {}
    
  • 最後まで文字列の部分文字列を取得します_

    string range $my_string 0 [string last _ $my_string]-1
    

    これは、文字列に がある場合にのみ機能します。それ以外の_場合はお勧めします

    expr {[set pos [string last _ $my_string]] != -1
          ? [string range $my_string 0 ${pos}-1]
          : $my_string}
    
于 2013-03-22T20:02:49.067 に答える
0

これには実際には正規表現は必要ありません: リスト操作はうまくいきます:

set new [join [lrange [split $my_string _] 0 end-1] _]
于 2013-03-22T23:18:50.260 に答える
0

使用する:

(.*)_[^_]*$

これは、「a までのすべての文字列の後に_、0 個以上の非_文字が続き、その後に文字列の末尾が続く」という意味です。これにより、それが最後のアンダースコアであることが保証されます。

于 2013-03-22T19:10:58.663 に答える