TCL スクリプトには、次のような文字列値を持つオブジェクトがあります。
ab_cde_12-3_xyz
def_5&6_hjk
zzz_1@234
最後の '_' の前 (ただし、含まない) の部分文字列を抽出する必要があります。
私が試してみました :
regexp -all -inline {(.*)(?=_)} $my_string
しかし、それは私が必要としない余分なゴミを与えます。
これを行うためのよりクリーンな方法はありますか?
ありがとう、ゲルト
わかりました、それを行うには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}
これには実際には正規表現は必要ありません: リスト操作はうまくいきます:
set new [join [lrange [split $my_string _] 0 end-1] _]
使用する:
(.*)_[^_]*$
これは、「a までのすべての文字列の後に_
、0 個以上の非_
文字が続き、その後に文字列の末尾が続く」という意味です。これにより、それが最後のアンダースコアであることが保証されます。