2016-08-23 105 views
0

我有大量的文本文档,并尝试从每个文档中提取特定部分。它总是以一行开头的“Item 7”开头,并且总是以另一行开头的“Item 8”结尾。我可以用正则表达式找到这部分:正则表达式:匹配字符串,但仅限于某些最小长度

(^(*)Item 7(.+?)^(*)Item 8) 

我的两个问题是:

  1. 有可能两个部分,在我的每个文件符合这一描述。我想确保我只匹配第二个,这也相当长。

  2. 如何在使用记事本++的“搜索和替换”查询中使用正则表达式提取此部分?

我不确定我是否使用了正确的工具。

谢谢!

增补: 在迄今为止的答案帮助下,我在记事本++中做了以下工作。 搜索

。*(^(*)项目* 7(?A)(?!^*项目7(?* A))(。+?)^(*)(? =^Item 8))。

Raplce与

$ 1

感谢您的帮助迄今。它的工作很好,只有一个优点。恐怕我不得不进入更多细节:我想从中提取文本的大多数(但不是全部)文档都有一张内容表。这就是为什么我想提取第二个“第7项到第8项”的情况,以防有两个。还有一个项目7A,以防万一你想知道我的代码。

正如我现在认识到的那样,在第7项到第8项的第二种情况下,有许多文档的每个页面上都有“项目7”作为标题。因此,我的代码只匹配项目的最后一页7在某些情况下。

我认为一个解决方案可能只是忽略项目7到项目8的情况,如果他们有一定的最小长度。具体而言,只要忽略项目7至项目8的情况,如果它们少于120个标志。

任何想法?

+0

尝试'(?m)^第7项([\ S \ s] *?)(?= ^第8项)'但是,您应该举例说明。 – sln

+0

如果有2个块,但没有ToC,会怎么样?那么,你怎么知道要抓什么?对不起,现在,这个问题没有解决方案,直到你制定上下文规则。 –

回答

0

我建议这样的:

^Item 7(?!.*^Item 7).*^Item 8 

此找到最后的[7项 - 项目8]在文件中对。

它可以在Notepad ++ 6.9.2中使用Find函数进行工作,使用正则表达式选项并检查. matches newline

注意:Find all in Current Document按钮似乎对正则表达式使用了不同的解释,显然忽略了负面预测。该解决方案仅适用于Find Next按钮。

+0

我还不确定为什么,但是这个正则表达式在一个重复块〜700行的文档上显示[不一致的结果](http://i.stack.imgur.com/olXcK.png)。 [Notepad ++ v6.9.2] – revo

+0

这似乎是Notepadd ++中的一个错误。我已经更新了现在似乎可以在较大文件中使用“查找下一个”按钮的正则表达式,但是“在当前文档中查找全部”按钮的行为似乎有所不同。 – trincot