Как сопоставить многострочную строку, если какая-то строка существует, а какая-то нет

#regex

Вопрос:

Я хочу сопоставить номер объекта в формате PDF. Я просто хочу, чтобы число перед «obj» соответствовало условию, что строка, следующая за ним в скобках<<><>>, содержит /ObjStm. Желаемое совпадение:

363 0

364 0

в то время как 2 0 — это не мой желаемый номер объекта. Как восстановить его?

%PDF-1,7

363 0 обьектов <

/Фильтр

/Плоский код /Первый 55 /Длина 339 /N 8 /Тип /ObjStm
>>>поток

что-то вроде лисьего рыка над собакой.

конечный поток

2 0 obj <</Тип sf ></Тип sf >> endobj

364 0 obj <</Фильтр/Плоский код/Первый 657/Длина 1492/N 75/Тип/ObjStm></Фильтр/Плоский код/Первый 657/Длина 1492/N 75/Тип/ObjStm>>поток somestream.

https://regex101.com/r/wU700E/1

Комментарии:

1. Пожалуйста, всегда добавляйте свой язык программирования (как указано в теге), например, с .NET этим довольно просто.

2. Что ж, (?s)(d d )s objs*<<(?:(?!<<).)*?/ObjStm(?:(?!<<).)*?>>stream может сработать. Смотрите демонстрацию регулярных выражений.

3. Это работает! Спасибо. Я потратил на это несколько часов, потому что не знаком с регулярным выражением.

4. Но это не сработает, если внутри есть <<><>> <>><<><>>. Например <<somestring <<someothestring><someothestring>><someothestring>>><someothestring>>> происходит сбой. Совпадение строк должно содержать только один «объект».

5. (?s)(d d )s objs*<<(?:(?!obj).)*?/ObjStm(?:(?!obj).)*?><(?:(?!obj).)*?/ObjStm(?:(?!obj).)*?>>поток работает сейчас.

Ответ №1:

Это должно сработать, если поддерживаются (часто)lookaheads:

 ^ *([d ] )objs <<(?:(?!>>)[sS]) /ObjStm(?:(?!>>)[sS])*>>
 

Смотрите демонстрацию на regex101.com.

Комментарии:

1. ^ *(d d )s objs <<(?:(?!obj)[sS]) /ObjStm(?:(?!obj)[sS])*><(?:(?!obj)[sS]) /ObjStm(?:(?!obj)[sS])*>> Это то, что мне было нужно.