2013-03-01 76 views
0

如何將正則表達式的樣子,如果我需要檢查,如果一個字符串具有一定的價值,檢查是否字符串正則表達式具有多個子

例如,它應該提取從以下字符串時間量(時間跨度),但前提是源字符串擁有所有Durationstartbitrate子共

Duration: 00:04:19.39, start: 0.157967, bitrate: 15636 kb/s 

線這應該被忽略:

Duration: 00:04:19.39, bitrate: 15636 kb/s 
start: 0.157967, bitrate: 15636 kb/s 
Duration: 00:04:19.39, start: 0.157967 
+1

是順序和格式總是相同的?持續時間,開始,比特率? – jurgenreza 2013-03-01 17:40:23

回答

2

既然你是做數據提取,我只是去與這個簡單的正則表達式:

^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+) 

時間戳可以第一個捕獲組中找到。

看起來數據是從程序日誌生成的,所以我假設這個間距是規則的。我的正則表達式將忽略源字符串中start,bitrateDuration的排序。如果你想不區分大小寫的匹配,然後打開標誌。

忽略順序會使長字符串的正則表達式變慢。我們有更多的假設(特別是關於排序),正則表達式越好。

說明

^ 
(?=.*start:) 
(?=.*bitrate:) 
.*Duration: ([\d.:]+) 

^錨字符串的開始。我爲了性能原因添加了這個,因爲如果正則表達式引擎已經徹底地回溯了所有的情況並且沒有找到匹配,那麼不需要檢查匹配。

(?=.*start:)零寬度正向預測。它會嘗試從字符串中的當前位置匹配.*start:,如果找到,則繼續從停止的位置開始匹配,如果找不到則停止。它被稱爲零寬度,因爲它實際上並不消耗字符串,而不是正則表達式的這一部分.*Duration: ([\d.:]+)

(?=.*bitrate:),與上面相同,檢查bitrate:是否在字符串的前面。

.*Duration: ([\d.:]+)與實際持續時間相符。我不打擾格式,因爲我假設你得到的是正確的,所以我只抓取最長的數字序列\d.:

消費字符的概念在字符串中有多個匹配項時非常重要。有時候,您需要在字符串之前檢查它是否包含特定的序列,然後才能決定該操作。這種檢查不應該消耗字符,因爲當您沒有完成當前位置的文本時,您不應該提前處理文本。如果您使用了文本,那麼您可能在文本中從當前位置到字符串中前面的文本中丟失了一些匹配項。

+1

你能解釋一下這個正則表達式嗎?對不起,但註冊。表情有時候很混亂。 – Agzam 2013-03-01 17:49:47

+0

我只需要持續時間的時間範圍值 – Agzam 2013-03-01 17:54:53

+0

@Agzam:嗯,它在第一個捕獲組。 – nhahtdh 2013-03-01 18:02:33

2

你需要的是整個字符串相匹配的表達,並具有捕獲組,你要提取的部分,是這樣的:

@"Duration: (\d{2}:\d{2}:\d{2}.\d{2}), start: \d+(.\d+)?, bitrate: \d+ kb/s" 

()包圍你的匹配組(的Duration值你想閱讀)。

+0

這對我有效 – Agzam 2013-03-01 18:17:34

0

如果格式和順序總是相同的,單純的正則表達式可能是這樣的:

Duration: (.*), start: .*, bitrate: .* 
相關問題