正则表达式:匹配字符串,但仅限于某些最小长度
我有大量的文本文档,并尝试从每个文档中提取特定部分。它总是以一行开头的“Item 7”开头,并且总是以另一行开头的“Item 8”结尾。我可以用正则表达式找到这部分:正则表达式:匹配字符串,但仅限于某些最小长度
(^(*)Item 7(.+?)^(*)Item 8)
我的两个问题是:
有可能两个部分,在我的每个文件符合这一描述。我想确保我只匹配第二个,这也相当长。
如何在使用记事本++的“搜索和替换”查询中使用正则表达式提取此部分?
我不确定我是否使用了正确的工具。
谢谢!
增补: 在迄今为止的答案帮助下,我在记事本++中做了以下工作。 搜索
。*(^(*)项目* 7(?A)(?!^*项目7(?* A))(。+?)^(*)(? =^Item 8))。
Raplce与
$ 1
感谢您的帮助迄今。它的工作很好,只有一个优点。恐怕我不得不进入更多细节:我想从中提取文本的大多数(但不是全部)文档都有一张内容表。这就是为什么我想提取第二个“第7项到第8项”的情况,以防有两个。还有一个项目7A,以防万一你想知道我的代码。
正如我现在认识到的那样,在第7项到第8项的第二种情况下,有许多文档的每个页面上都有“项目7”作为标题。因此,我的代码只匹配项目的最后一页7在某些情况下。
我认为一个解决方案可能只是忽略项目7到项目8的情况,如果他们有一定的最小长度。具体而言,只要忽略项目7至项目8的情况,如果它们少于120个标志。
任何想法?
我建议这样的:
^Item 7(?!.*^Item 7).*^Item 8
此找到最后的[7项 - 项目8]在文件中对。
它可以在Notepad ++ 6.9.2中使用Find函数进行工作,使用正则表达式选项并检查. matches newline
。
注意:Find all in Current Document
按钮似乎对正则表达式使用了不同的解释,显然忽略了负面预测。该解决方案仅适用于Find Next
按钮。
尝试'(?m)^第7项([\ S \ s] *?)(?= ^第8项)'但是,您应该举例说明。 – sln
如果有2个块,但没有ToC,会怎么样?那么,你怎么知道要抓什么?对不起,现在,这个问题没有解决方案,直到你制定上下文规则。 –