如何捕获 "closest" 组(正则表达式)?

How to capture the "closest" group (regex)?

我认为最好是举例说明。

我正在解析如下内容(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
---
---

Dashes for example only, in the real data dashes can be anything (various control characters / numerics / matrices / whatnot).

目前我正在捕获这些组:

# 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 捕获最接近文本组 的剪辑组?

我有这个:

但我想要这个:


更新:参见 Regex101

您可以在 .*? 匹配中的每个字符之后为后跟 re\nW 的 4 个数字添加否定前瞻,以排除该模式在与文本匹配之前再次出现:

# 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)

Demo on regex101