2012-08-16 110 views
1

我試圖找到一種模式匹配如下 abc(xxxx):efg(xxxx):xyz(xxxx)其中xxxx - [0-9]數字TCL正則表達式模式搜索

我用

set string "my string is abc(xxxx):efg(xxxx):xyz(xxxx)" 
regexp abc(....):efg(....):xyz(....) $string result_str 

則返回0誰能幫助?

回答

2

你得到的問題是,()在Tcl(和許多其他RE引擎除外)中的正則表達式有特殊含義,因爲它們表示捕獲子RE。爲了使字符「正常」,它們必須用反斜線進行轉義,這意味着最好將正則表達式放在花括號中(因爲反斜槓是一般的Tcl元字符)。

這樣:

% set string "my string is abc(xxxx):efg(xxxx):xyz(xxxx)" 
% regexp {abc\(....\):efg\(....\):xyz\(....\)} $string 
1 

如果你想捕捉那些括號中的內容,你需要一個稍微複雜的RE:

regexp {abc\((....)\):efg\((....)\):xyz\((....)\)} $string \ 
     all abc_bit efg_bit xyz_bit 

注意那些....序列總是完全匹配四個字符,但最好是更具體。要匹配任意數量的數字在每種情況下:

regexp {abc\((\d+)\):efg\((\d+)\):xyz\((\d+)\)} $string -> abc efg xyz 

當使用regexp提取串位,這是很常見的使用->作爲整個字符串匹配一個(很奇怪)變量名;它看起來很像記憶中的「將提取出的片段發送給這些變量」。

+0

交互式測試時,'regexp -inline'非常棒,因爲它返回所有匹配的子串的列表,而不是找到匹配。 – 2012-08-16 09:36:25

+0

感謝Donal和其他人提出寶貴的建議。讚賞。 – pcbnagaraj 2012-08-16 09:57:36

0

沒有與tcl工作,但似乎你需要逃過()。此外,如果您確定x的數字是數字,請使用\d{4}而不是....。基於此,您可以嘗試更新的正則表達式是

abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\)

+0

這個失敗。當我嘗試字符串abc(12):efg(78)regexp abc(..):efg(..)它的工作原理。不知道是什麼原因導致四位數的問題。 – pcbnagaraj 2012-08-16 09:15:54

+0

對不起,我認爲你問題中的'xxxx'意思是4位數字。如果它可以是任意數字的數字,則在正則表達式中用'\ d +'替換'\ d {4}'。 – mtariq 2012-08-16 09:19:59

+0

也基於你的評論中的例子,似乎'abc(xxx)'可以重複任意次數(在你使用'abc ... efg ... xyz ...'的問題中)。你能否澄清一下,以便我可以根據需要更新答案? – mtariq 2012-08-16 09:22:14