2016-08-23 100 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