2011-01-20 35 views
0

我試圖用正則表達式來破譯FFmpeg輸出,但是我有問題,因爲有時線存在有時它們沒有,例如對於文件是音頻文件而不有一條視頻線。正則表達式匹配一條線,當它存在與否

視頻示例文本;

Seems stream 0 codec frame rate differs from container frame rate: 30000.00 (30000/1) -> 15.00 (15/1) 
Input #0, avi, from 'making_of_divx5mp3.avi': 
    Duration: 00:27:46.60, start: 0.000000, bitrate: 154 kb/s 
    Stream #0.0: Video: mpeg4, yuv420p, 320x240 [PAR 1:1 DAR 4:3], 15 fps, 15 tbr, 15 tbn, 30k tbc 
    Stream #0.1: Audio: mp3, 24000 Hz, 2 channels, s16, 40 kb/s 
At least one output file must be specified 

音頻示例文本;

輸入#0,OGG,從 'C:\ examplemedia \ Americanism_(Franklin_D._Roosevelt).OGG': 時間:00:04:21.24,啓動:0.000000,比特率:49 kb/s的 流#0.0 :音頻:Vorbis格式,11025赫茲,單聲道,S16,49 kb/s的 至少一個輸出文件,必須指定

我的正則表達式

Š{2}時間[:] \ S(? \ d {2} [:] \ d {2} [:] [。] \ d {2})\ d {2} [,] \ S {1}開始[:] \ S {1} \ d { 1,} [。] \ d {6} [,] \ s {1} bitrate [:] \ s {1}(?\ d {1,} \ skb [/] s)+

\ s {4} Stream \ s [#] \ d [。] \ d [:] \ sVideo [:] \ s(?\ w +)[,] \ s(?\ w +)[,] \ s [\] \ d [。] \ d [:] \ sAudio [:] \ d [2,} [x] \ d {2,})。+

\ S [,] \ S(\ d + \ SHZ?)[,] \ S(\ W +?)((\ d \ schannels |?單聲道))[,] \ S(?\ W +)([,] \ S (?\ d {2,} \ SKB [/] S)|)

我試圖與缺乏線的要解決的問題通過改變一個包括(正則表達式|),它應當匹配NULL,但它打破我的正則表達式,然後什麼都不返回。我認爲這將工作,因爲表達式從右到左讀。

(\s{4}Stream\s[#]\d[.]\d[:]\sVideo[:]\s(?<videocodec>\w+)[,]\s(?<pixelformat>\w+)[,]\s(?<resolution>\d{2,}[x]\d{2,}).+|) 

感謝您的幫助!

回答

0

也許你可以拆分字符串,並分別在每一行工作。所以你可以通過循環來嘗試將它們與可能的格式列表進行匹配。

EDIT 確定以保持在一個正則表達式

與「或」分開每行的正則表達式和在括號內。最後放一個量詞。所以它可以匹配最多3行匹配任何一種不同的行格式。

(audio_regex | video_regex | other_regex){1,3}

+0

想過,但理想的我希望把一切都在一個正則表達式,少了幾分代碼,希望整潔!? – wonea 2011-01-20 10:38:53