2011-01-20 3 views
0

Я пытаюсь расшифровать вывод FFmpeg с помощью регулярных выражений, однако у меня возникают проблемы, так как иногда существуют строки, иногда они этого не делают, например, для файлов - это аудиофайлы, а не есть видео линия.Regex соответствует строке, когда она существует, или нет

Пример текста для видео;

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 

Пример текста для аудио;

Input # 0, OGG, из 'C: \ examplemedia \ Americanism_ (Franklin_D._Roosevelt) .ogg': Продолжительность: 00: 04: 21,24, старт: 0.000000, битрейт: 49 кб/с поток # 0,0 : Аудио: Vorbis, 11025 Гц, моно, s16,/s выходной файл 49 кб По крайней мере, один должен быть указан

Моя регулярное выражение

ы {2} Продолжительность [:] \ s (? \ д {2} [:] \ d {2} [:] [.] \ д {2}) \ д {2} [,] \ с {1} начать [:] \ s {1} \ d { 1,} [.] \ D {6} [,] \ s {1} битрейт [:] \ s {1} (? \ D {1,} \ skb [/] s). +

\ s {4} Поток \ s [#] \ d [.] \ D [:] \ sВидео [:] \ s (? \ W +) [,] \ s (? \ W +) [,] \ s (? \ d {2,}) +

\ s {4} Поток \ s [#] \ d [.] \ d [:] \ sAudio [:] \ с [,] \ s (\ d + \ SHZ?) [,] \ s (\ W +?) ((\ д \ 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 нормально держать в одном регулярном выражении

отделить регулярные выражения для каждой строки с «или» и окружать в скобках. поместите квантификатор в конец. поэтому он может соответствовать до трех строк, соответствующих любому из разных форматов линий.

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

+0

Мысль об этом, но в идеале я хотел бы, чтобы держать все в одном регулярном выражении, немного меньше кода и, надеюсь, опрятнее !? – wonea

+0

Я пробовал это, но уменьшил квантификатор до 2, однако видеорежим не смог ничего захватить. – wonea

+0

ну, то вы либо попробовали это неправильно, либо искали неправильные группы захвата – amcashcow

Смежные вопросы