2013-12-17 40 views
0

匹配其上一行以一組字符開頭的行的正則表達式是什麼?正則表達式:如果前一行符合條件,則匹配行

我試圖解析M3U files,我需要用來匹配前面的行與#EXTINF:所以開始,如果我們把這個例子中的臺詞:我只想提取這些線

#EXTM3U 
#EXT-X-VERSION:3 
#EXT-X-TARGETDURATION:10 
#EXTINF:11.54 
ASMIK_tid_0000250058_m.600000-00000.ts 
#EXTINF:8.51 
ASMIK_tid_0000250058_m.600000-00001.ts 
#EXTINF:11.76 
ASMIK_tid_0000250058_m.600000-00002.ts 
#EXTINF:10.05 
ASMIK_tid_0000250058_m.600000-00003.ts 
etc... 

ASMIK_tid_0000250058_m.600000-00000.ts 
ASMIK_tid_0000250058_m.600000-00001.ts 
ASMIK_tid_0000250058_m.600000-00002.ts 
ASMIK_tid_0000250058_m.600000-00003.ts 

我已經試過變化對this answer這:(?#EXT.*\n)但沒有運氣...

+0

你能發佈最成功的變化,你已經嘗試過?另外,你可能會發現那些不以'#'開頭的行? – Jerry

+0

我在正則表達式中加入了我的最佳嘗試。 – Eric

+0

這是真的嗎?這與您在問題中鏈接的答案有很大區別......您可能想嘗試如下所示的方法:'#EXT [^ \ r \ n] * [\ r \ n] +([^#] [^ \ r \ n] +)'您要查找的行是在第一個捕獲組中。 – Jerry

回答

0

首先你必須以確保您使用的功能是匹配整個文件而不是逐行,否則這是不可能的。

那麼你就需要指定一個回顧後:

(?<=#EXTINF.*\r\n).*

如果您正則表達式實現不支持一個回顧後的內部lookbehinds或者重複,你可以使用兩個捕獲組,而不是:

(#EXTINF.*\r\n)(.*)

顯然你會忽略第一個捕獲組,但保留第二個捕獲組中的所有數據。

如果您需要手動指定該.不匹配換行符,您可以指定在正則表達式的開始方式:(?-s)

+0

我認爲你的意思是一個超前。 – Jerry

+0

我的意思是向後看,除了我寫了一個lookahead :)現在編輯。 –

+0

@VasiliSyrakis謝謝,但你的正則表達式不起作用:http://gskinner.com/RegExr/?37m7a – Eric