,如果我有一個字符串,如:TCL條表達(變字符)
foo_image_v001.ext
,可以很容易地說
bar_image_v001.ext
我怎樣才能使用TCL去掉第一個下劃線和所有右邊的東西,只留下'foo'或'bar'
我通常是一個蟒蛇小子,對TCL不甚瞭解,但它最適合在這種情況下,如果我可以得到它的工作=)
,如果我有一個字符串,如:TCL條表達(變字符)
foo_image_v001.ext
,可以很容易地說
bar_image_v001.ext
我怎樣才能使用TCL去掉第一個下劃線和所有右邊的東西,只留下'foo'或'bar'
我通常是一個蟒蛇小子,對TCL不甚瞭解,但它最適合在這種情況下,如果我可以得到它的工作=)
第一_
set new [regsub {_.*} $old {}]
下面是做到這一點的一種方法:
set filename foo_image_v001.ext
set prefix [regsub {_.*} $filename ""]
的regsub會在$文件名中的模式{_.*}
,和用什麼都替換它""
。
後取代一切也許你可以使用它?
set string "foo_image_v001.ext"
regexp -- {^([^_]+)} $string - var
foo
被存儲在$var
。
你能讓我知道爲什麼id使用這種方法,而不是 [regsub -all {_。*} $ old {}] 我只是沒有得到雙破折號(正則表達式 - ) 或{^([^ _ ] +)} 乍一看,我不能告訴^(是否意味着保持所有,直到...然後[^ _] +)是刪除_和所有尾隨$字符串? – aescript
這匹配從開始('^')跟隨非'_'字符的所有序列。不必要的'()'來獲得結果。 '--'表示開關結束(如果您的正則表達式以'-'開頭,則很重要)。同樣將'foo'保存爲'-'。 'regexp {^ [^ _] +} $ new new'做同樣的工作。 –
@ user1917081而不是實際上在下劃線之後查找所有內容,並且不進行任何替換,它只是捕獲下劃線(第一個)之前的所有內容並將其分配給變量'$ var'。括號和開關的結尾(並以這種方式捕捉變量)只是我的正則表達式中的一致性問題。 – Jerry
不需要打破此正則表達式:使用string
命令
:
set prefix [string range $filename 0 [expr {[string first _ $filename] - 1}]]
另外,如果你劈在下劃線的字符串,你想要的是第一個元素結果列表:
set prefix [lindex [split $filename _] 0]
很酷這個工作很好!所以我想regsub是來自python的TCL的re版本?不確定全部是什麼 - 全部是什麼,以及即時猜測{_。*}是在下劃線之後表達任何字符的表達方式?那麼$ old就是我的文件名,{}就是我用'(在我們的例子中是空白)'來代替這些字符的正確嗎? – aescript
['regsub'](http://www.tcl.tk/man/tcl8.6/TclCmd/regsub.htm)用於替換。是的,你是對的。對於匹配,還有['regexp'](http://www.tcl.tk/man/tcl8.6/TclCmd/regexp.htm)。正則表達式在大多數編程語言中都很常見。 –
您不需要'-all',因爲RE將匹配字符串的尾部。 –