2013-03-18 30 views
2

我是一名新手,並且在使我的tcl腳本正常工作時遇到了一些麻煩。我在網上搜索,似乎無法理解我做錯了什麼。下面是我寫的:tcl在迭代列表中的項目時獲得正則表達式匹配

set list {f01-1 f01-2 f02-1 m01-1 m01-2 m02-1} 
foreach item $list { 
    if { [regexp {\w\d\d} $list match ] } { 
     puts $match 
    } 
} 

這裏的輸出我得到:

f01 
f01 
f01 
f01 
f01 
f01 

然而,這是我想做什麼,並有望獲得:

f01 
f01 
f02 
m01 
m01 
f02 

有誰有什麼建議獲得我的預期?

謝謝你提前!

+2

我比'tcl'中的新手少,但是foreach body根本不會引用'item'。那是故意的嗎? :-) – azhrei 2013-03-18 23:02:35

+0

你的代碼片段不能與你實際使用的代碼片段匹配,因爲a)'$ string'沒有在任何地方聲明,b)你的正則表達式實際上會吐出「f0」而不是「f01」。 – 2013-03-18 23:04:13

+0

抱歉!編輯到我實際上有! (我也是一個新手張貼,顯然...哈哈) – KaleidoEscape 2013-03-18 23:05:24

回答

4

你的代碼片段似乎並不符合您的實際代碼,但我猜$string有同樣的事情$list,這意味着你要重新運行在原始字符串的正則表達式多次,而不是在每個項目上。此外你的正則表達式是錯誤的。下面應該工作:

set list {f01-1 f01-2 f02-1 m01-1 m01-2 m02-1} 
foreach item $list { 
    if { [regexp {\w\d+} $item match ] } { 
     puts $match 
    } 
} 

這裏的顯着差異,除了固定的正則表達式,是現在它在$item運行它,而不是在$list

+0

謝謝Kevin Ballard!這完全回答了我的問題(我覺得這是一個愚蠢的錯誤)。如果我有足夠的代表,我會贊成你的回答。 =( – KaleidoEscape 2013-03-18 23:08:44

+0

@ user2184303:你應該仍然能夠接受答案,對嗎?繼續並點擊我答案旁邊的複選框將其標記爲已接受,這會產生給你+2代表的副作用 – 2013-03-18 23:10:39

+0

是的,我接受了,謝謝! – KaleidoEscape 2013-03-18 23:15:51

0

[正則表達式{\ W \ d \ d} $列表匹配]將試圖找到在給定的列表指定的RE的第一次出現。

相反,你應該這樣做:

[正則表達式{\ W \ d \ d} $項目匹配] RE是否匹配,這將檢查每個項目並打印!