Как захватить «ближайшую» группу (регулярное выражение)? - PullRequest
0 голосов
/ 12 февраля 2020

Я думаю, лучше всего спросить на примере.

Я разбираю что-то вроде ниже (определения прямоугольника и текста в содержимом PDF):

---
---
85.039 42.52 42.519 42.52 re
W--
---
---
127.559 42.52 42.519 42.52 re
W--
---
---
170.078 42.52 42.52 42.52 re
W--
---
---
BT
---
Text
---
ET
---
---
170.078 42.52 42.52 42.52 re
W--
---
---
127.559 42.52 42.519 42.52 re
W--
---
---
BT
---
Text
---
ET
---
---
170.078 42.52 42.52 42.52 re
W--
---
---
BT
---
Text
---
ET
---
---

Тире, например, только , в реальных точках данных может быть что угодно (различные управляющие символы / цифры / матрицы / еще много чего).

В настоящее время я собираю эти группы:

# Clipping Rectangle
(?<x>\b[-0-9\.]+\b)(\s)
(?<y>\b[-0-9\.]+\b)(\s)
(?<width>\b[-0-9\.]+\b)(\s)
(?<height>\b[-0-9\.]+\b)(\s)
(re\nW)

(.*?)

# Text
(BT)
(?<text>.*?)
(ET)

Но в этих матчах захватывается первый (самый дальний) прямоугольник отсечения вместо последнего (ближайшего). Как я могу захватить ближайшие группы отсечения к текстовым группам , используя Regex ?

У меня есть это: enter image description here

Но я хочу этого: enter image description here


ОБНОВЛЕНИЕ: см. Regex101 .

1 Ответ

1 голос
/ 12 февраля 2020

Вы можете добавить отрицательный прогноз для 4 чисел, за которыми следует re\nW после каждого символа в .*? совпадении, чтобы исключить повторение шаблона перед совпадением с текстом:

# Clipping Rectangle
(?<x>\b[-0-9\.]+\b)(\s)
(?<y>\b[-0-9\.]+\b)(\s)
(?<width>\b[-0-9\.]+\b)(\s)
(?<height>\b[-0-9\.]+\b)(\s)
(re\nW)

((?:.(?!(\b[-\d.]+\b\s){4}re\nW))*?)

# Text
(BT)
(?<text>.*?)
(ET)

Демонстрация на regex101

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...