讓我們看看我是否理解你的問題。你有一個Tcl字符串,你想匹配$::env(something)/somethingelse/
的模式,識別something
和somethingelse
部分。
如果是這樣,那麼你要使用somethink像
set str {$::env(WORK)/bill/}
if {[regexp {\$::env\((.+)\)/(.+)/} $string -> envName dirName]} {
puts $envName
puts $dirName
}
,你應該有
WORK
bill
打印你的終端上。
在regexp
命令中,該模式包含在{}
中以避免Tcl替換。它從一個逃脫的美元\$
開始,因爲美元會匹配一行的結尾。接下來是文字::env
。然後轉義圓括號\(...\)
以匹配數組語法。選取它們,我們有一個捕獲原子(.+)
用於將任何重複一次或多次的字符與報告進行匹配。然後用第二個捕獲原子/.../
跟隨文字斜槓(.+)
匹配目錄部分。
的->
是將包含在$str
與模式匹配一切變量的名稱(您可以通過puts ${->}
打印出來看的話),但它不是在這種情況下需要的,所以我們用陌生的名字。
然後兩個var名稱如下,envName
和dirName
,它們將分別報告第一個和第二個原子的匹配(括號不包括在內)。
編輯對於非貪婪匹配,如多納爾研究員指出,可以用(.+?)
代替(.+)
,我同意這將是一個很好的補充。
我希望這可以滿足您的需求。
我試過這個,它的工作原理:if {![file isdirectory「$ {:: env(WORK)}/bill /」]} {} else { return 1}但是我想試試它regexp – arkanoid 2013-02-23 21:46:14
正則表達式{^(bill)$}爲第二個單詞。第一個詞,因爲它是環境變量我卡在那裏 – arkanoid 2013-02-23 22:01:30
既然你已經有一些工作,是否有一個原因,你需要正則表達式? – 2013-02-24 05:40:58