首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用regex匹配包含特定字符串出现的行后面的某些行数。

使用regex匹配包含特定字符串出现的行后面的某些行数。
EN

Stack Overflow用户
提问于 2016-01-28 17:59:15
回答 3查看 297关注 0票数 1

我在InDesign中工作,格式化大量的文本。这是一个文本的样本。

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

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

我的想法是尝试一个积极的背景,像这样:

代码语言:javascript
复制
(?<=\(3 parts\)$)^.*$

但它和任何东西都不匹配。

EN

回答 3

Stack Overflow用户

发布于 2016-01-31 23:02:05

查找部分是正确的,但符号^ (开始段)和$ (结束段)的使用仅限于匹配位置--仅- not实际的“硬返回”字符。这就是表达式失败的原因:默认情况下,.“匹配所有”字符不匹配返回。因此,这使得第一个测试(?<=\(3 parts\)$)^.失败:根据这个默认规则,查找后面的$^都不消耗返回,下面的.也不匹配它。

这是可能的,把GREP到单线模式-一个有趣的描述,可能会让你在错误的脚。从GREP的角度来看,它还允许.匹配返回;因此,整个运行的文本,硬返回和所有,都可以被认为是“单行(长)行”。它的代码是(?s),通常放在表达式的最前面。

这本身并不足以让它发挥作用,因为

代码语言:javascript
复制
(?s)(?<=\(3 parts\)$)^.

仍然期望在$^之间返回(否则任何一个都是错误的!)无论如何,这不是一个很好的方式来匹配一定数量的段落。调整表达式

代码语言:javascript
复制
(?s)(?<=\(3 parts\)$).^.*

正确的工作在消费硬回报,但选择所有的东西,直到最后。

我提出了一种简单得多的方法:如果您想获得一定数量的硬回报,只需立即将它们包含在表达式中--它们的GREP代码是\r

这导致了以下情况:

代码语言:javascript
复制
(?<=\(3 parts\)\r)(.*\r){3}

在这里,查找是您已经得到的,再加上返回到该特定行的末尾(因为您也不想获取该返回),然后是三次重复的序列以获取整个行,.*\r

票数 1
EN

Stack Overflow用户

发布于 2016-01-28 18:06:10

这会对你有好处吗?

代码语言:javascript
复制
\Q(3 parts)\E\r((?:.*$\R){3})

regex101.com上的演示。正如@Jongware所指出的,它似乎是Adobe中的\r (小写)。

票数 0
EN

Stack Overflow用户

发布于 2016-01-28 18:09:03

您可以在-A中使用grep选项

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35068678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档