我在InDesign中工作,格式化大量文本。以下是文本示例。
NEW!办公室业务证书(3部分)
办公室运营
经理人网络安全 在工作场所拥抱可持续性
3D打印简介
制造商技术简介:新店类
我需要能够匹配包含字符串"(3部分)"的行后面的三行。
我的想法是尝试这样一个积极的观察:
(?<=\(3 parts\)$)^.*$
但它并不匹配任何东西。
答案 0 :(得分:1)
lookbehind部分是正确的,但使用符号^
(Begin Paragraph)和$
(End Paragraph)仅限于匹配位置 - 不实际的“硬回归”字符。这就是你的表达式失败的原因:默认情况下,.
“匹配所有”字符不匹配返回。因此,第一次测试(?<=\(3 parts\)$)^.
失败:后备中的$
和^
都没有消耗返回,而后面的.
也不匹配,每个默认规则。
可以将GREP置于单线模式 - 这可能会让您误入歧途。从GREP的角度来看,它允许.
匹配一个回报;所以整个运行的文本,硬回报和所有,可以被认为是“单(长)线”。它的代码是(?s)
,通常放在表达式的最前面。
这本身并不足以使其发挥作用,因为
(?s)(?<=\(3 parts\)$)^.
仍然希望在$
和^
之间返回(否则任何一个都会出错!)。无论如何,这不是匹配一定数量段落的好方法。调整后的表达
(?s)(?<=\(3 parts\)$).^.*
在消费硬回报时正常工作,但也选择一直到最后。
我提出了一个更简单的方法:如果你想获得一定数量的硬回报,只需将它们立即包含在你的表达中 - 他们的GREP代码是\r
。
这导致以下结果:
(?<=\(3 parts\)\r)(.*\r){3}
其中lookbehind是你已经得到的,加上返回结束那个特定的行(并且它在lookbehind中,因为你也不想获得那个返回),然后重复三次序列来获取整行,.*\r
。
答案 1 :(得分:0)
这会适合你吗?
\Q(3 parts)\E\r((?:.*$\R){3})
见a demo on regex101.com。正如@Jongware指出的那样,Adobe InDesign中似乎是\r
(小写)。
答案 2 :(得分:0)
您可以在-A
中使用grep
选项:
grep -A 3 -F '(3 parts)' file
NEW! Certificate in Office Operations (3 parts)
Office Operations
Cyber Security for Managers
Embracing Sustainability in the Workplace