Регулярное выражение: соответствует строке, если предыдущая строка удовлетворяет критерию

Что такое регулярное выражение, которое будет соответствовать строкам, предыдущая строка которых начинается с набора символов?

Я пытаюсь проанализировать файлы M3U, и мне нужно сопоставить строки, предыдущая строка которых начинается с #EXTINF: Итак, если мы возьмем этот пример:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXTINF:11.54
ASMIK_tid_0000250058_m.600000-00000.ts
#EXTINF:8.51
ASMIK_tid_0000250058_m.600000-00001.ts
#EXTINF:11.76
ASMIK_tid_0000250058_m.600000-00002.ts
#EXTINF:10.05
ASMIK_tid_0000250058_m.600000-00003.ts
etc...

Я хочу извлечь только эти строки:

ASMIK_tid_0000250058_m.600000-00000.ts
ASMIK_tid_0000250058_m.600000-00001.ts
ASMIK_tid_0000250058_m.600000-00002.ts
ASMIK_tid_0000250058_m.600000-00003.ts

Я пробовал варианты этот ответ и это: (?#EXT.*\n) но не повезло...


person Eric    schedule 17.12.2013    source источник
comment
Не могли бы вы опубликовать самый удачный вариант, который вы пробовали? Кроме того, может ли быть так, что строки, которые вы ищете, не начинаются с #?   -  person Jerry    schedule 17.12.2013
comment
Я добавил свою лучшую попытку регулярного выражения.   -  person Eric    schedule 17.12.2013
comment
Это действительно так? Это сильно отличается от ответа, который вы указали в своем вопросе... Вы можете попробовать что-то вроде: #EXT[^\r\n]*[\r\n]+([^#][^\r\n]+) Строки, которые вы ищете, находятся в первой группе захвата.   -  person Jerry    schedule 17.12.2013
comment
Спасибо, Джерри, но я не могу заставить ваше регулярное выражение соответствовать только тем строкам, которые мне нужны. см. здесь. Если вы можете мне помочь, пожалуйста, напишите ответ.   -  person Eric    schedule 17.12.2013
comment
Знаете ли вы, поддерживает ли регулярное выражение объектива c просмотр назад переменной ширины? Я не знаю, как писать код в Objective C, иначе я бы попробовал ideone. В противном случае вы используете замену? Если да, возможно, вы могли бы использовать что-то вроде это?   -  person Jerry    schedule 17.12.2013
comment
Похоже, он поддерживает поиск позади , но я еще не разобрался с этим. Ваше регулярное выражение работает в тестовой системе, но мне нужно выяснить, как перевести его на Obj-C.   -  person Eric    schedule 17.12.2013
comment
Хорошо, похоже, что Objective C поддерживает просмотр назад с переменной шириной. Не могли бы вы попробовать (?<=#EXT[^\r\n]*[\r\n]+)[^#][^\r\n]+ со спичкой? Если это сработает, я удалю этот комментарий и поставлю его как ответ.   -  person Jerry    schedule 17.12.2013
comment
Спасибо @Jerry, я попробовал это регулярное выражение, но получил ошибки. Я искал помощь, но не смог понять это из.   -  person Eric    schedule 18.12.2013
comment
Я в тупике. Как вы думаете, вы могли бы поместить что-нибудь на ideone, сайт, на который я ссылался ранее, и поставить ссылку на пример кода? Было бы проще отлаживать интерактивный код, и мне не придется ждать, пока вы проверите, работает что-то или нет. Надеюсь, на сайте есть необходимые библиотеки для запуска регулярных выражений.   -  person Jerry    schedule 18.12.2013
comment
ideone не имеет API Cocoa, и NSRegularExpression является его частью. Я пытался использовать это, но у меня была та же проблема... Во всяком случае, ваш регулярное выражение работает, поэтому на данном этапе это проблема obj-c, которую я выясню в другом месте. Спасибо!   -  person Eric    schedule 18.12.2013
comment
Ах хорошо. Удачи тогда с этим :)   -  person Jerry    schedule 18.12.2013


Ответы (1)


Во-первых, вы должны быть уверены, что используемая вами функция соответствует всему файлу, а не построчно, иначе это невозможно.

Затем вам нужно будет указать lookbehind:

(?<=#EXTINF.*\r\n).*

Если ваша реализация регулярного выражения не поддерживает просмотр назад ИЛИ повторение внутри просмотра назад, вместо этого вы можете использовать две группы захвата:

(#EXTINF.*\r\n)(.*)

Очевидно, вы просто проигнорируете первую группу захвата, но сохраните все данные во второй группе захвата.

Если вам нужно вручную указать, что . не соответствует новой строке, вы можете указать режим в начале регулярного выражения: (?-s)

person Vasili Syrakis    schedule 17.12.2013
comment
Я думаю, вы имели в виду предварительный просмотр. - person Jerry; 17.12.2013
comment
Я имел в виду просмотр назад, за исключением того, что я написал просмотр вперед :), теперь отредактировано. - person Vasili Syrakis; 17.12.2013
comment
@VasiliSyrakis спасибо, но ваше регулярное выражение не работает: gskinner.com/RegExr/?37m7a - person Eric; 17.12.2013