#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.
Комментарии:
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])*>> Это то, что мне было нужно.