我試圖找到一種模式匹配如下 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誰能幫助?
我試圖找到一種模式匹配如下 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誰能幫助?
你得到的問題是,(
和)
在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
提取串位,這是很常見的使用->
作爲整個字符串匹配一個(很奇怪)變量名;它看起來很像記憶中的「將提取出的片段發送給這些變量」。
沒有與tcl工作,但似乎你需要逃過(
和)
。此外,如果您確定x
的數字是數字,請使用\d{4}
而不是....
。基於此,您可以嘗試更新的正則表達式是
abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\)
。
這個失敗。當我嘗試字符串abc(12):efg(78)regexp abc(..):efg(..)它的工作原理。不知道是什麼原因導致四位數的問題。 – pcbnagaraj 2012-08-16 09:15:54
對不起,我認爲你問題中的'xxxx'意思是4位數字。如果它可以是任意數字的數字,則在正則表達式中用'\ d +'替換'\ d {4}'。 – mtariq 2012-08-16 09:19:59
也基於你的評論中的例子,似乎'abc(xxx)'可以重複任意次數(在你使用'abc ... efg ... xyz ...'的問題中)。你能否澄清一下,以便我可以根據需要更新答案? – mtariq 2012-08-16 09:22:14
交互式測試時,'regexp -inline'非常棒,因爲它返回所有匹配的子串的列表,而不是找到匹配。 – 2012-08-16 09:36:25
感謝Donal和其他人提出寶貴的建議。讚賞。 – pcbnagaraj 2012-08-16 09:57:36