既然你是做數據提取,我只是去與這個簡單的正則表達式:
^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+)
時間戳可以第一個捕獲組中找到。
看起來數據是從程序日誌生成的,所以我假設這個間距是規則的。我的正則表達式將忽略源字符串中start
,bitrate
和Duration
的排序。如果你想不區分大小寫的匹配,然後打開標誌。
忽略順序會使長字符串的正則表達式變慢。我們有更多的假設(特別是關於排序),正則表達式越好。
說明
^
(?=.*start:)
(?=.*bitrate:)
.*Duration: ([\d.:]+)
^
錨字符串的開始。我爲了性能原因添加了這個,因爲如果正則表達式引擎已經徹底地回溯了所有的情況並且沒有找到匹配,那麼不需要檢查匹配。
(?=.*start:)
零寬度正向預測。它會嘗試從字符串中的當前位置匹配.*start:
,如果找到,則繼續從停止的位置開始匹配,如果找不到則停止。它被稱爲零寬度,因爲它實際上並不消耗字符串,而不是正則表達式的這一部分.*Duration: ([\d.:]+)
。
(?=.*bitrate:)
,與上面相同,檢查bitrate:
是否在字符串的前面。
.*Duration: ([\d.:]+)
與實際持續時間相符。我不打擾格式,因爲我假設你得到的是正確的,所以我只抓取最長的數字序列\d
,.
和:
。
消費字符的概念在字符串中有多個匹配項時非常重要。有時候,您需要在字符串之前檢查它是否包含特定的序列,然後才能決定該操作。這種檢查不應該消耗字符,因爲當您沒有完成當前位置的文本時,您不應該提前處理文本。如果您使用了文本,那麼您可能在文本中從當前位置到字符串中前面的文本中丟失了一些匹配項。
是順序和格式總是相同的?持續時間,開始,比特率? – jurgenreza 2013-03-01 17:40:23