2011-01-20 43 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