使用正则表达式匹配包含特定字符串

时间:2016-01-28 17:59:16

标签: regex grep adobe-indesign

我在InDesign中工作,格式化大量文本。以下是文本示例。

  

NEW!办公室业务证书(3部分)
  办公室运营
  经理人网络安全   在工作场所拥抱可持续性
  3D打印简介
  制造商技术简介:新店类

我需要能够匹配包含字符串"(3部分)"的行后面的三行。

我的想法是尝试这样一个积极的观察:

(?<=\(3 parts\)$)^.*$

但它并不匹配任何东西。

3 个答案:

答案 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