2016-08-23 8 views
0

膨大な数のテキスト文書があり、それぞれから特定の部分を抽出しようとします。行の先頭に常に「Item 7」で始まり、別の行の先頭に常に「Item 8」で終わります。私は正規表現でこの部分を見つけることができます。RegEx:特定の最小長の文字列に一致します

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

私の二つの質問は以下のとおりです。

  1. が潜在的に私の文書のそれぞれにこの記述に合う2つの部分があります。私は2番目のものと一致することを確かめたい。

  2. notepad ++を使用して「検索と置き換え」クエリで正規表現を使用してこの部分を抽出するにはどうすればよいですか?

これに適切なツールを使用しているのかどうかはわかりません。

ありがとう!

補足: これまでの回答の助けを借りて、私はメモ帳で次のようにしました。++。

ため 検索。*(^(*)項目* 7(?! A)(?!。 ^項目* 7(?! * A))(。+?)^(*)(? = ^アイテム8))。これまでのあなたの助けのための

$ 1

おかげで

Raplce。 1つの例外を除いてうまく動作します。私はもっ​​と詳しく説明しなければならないのではないかと心配しています。テキストの抽出元となるドキュメントの大半は、すべてではありません。だから私は2番目のケース「Item 7 to Item 8」を抽出したいのです。また、私のコードについて不思議な場合に備えて、Item 7Aがあります。

これまで分かったように、項目7から項目8までの2番目のケースでは、各ページのヘッダーに「項目7」という項目があります。したがって、私のコードはItemの最後のページにのみ一致しますいくつかの例では7である。

解決策は、項目7から項目8のケースを無視し、特定の最小の長さしか持たない場合があると考えました。具体的には、アイテム数が120未満の場合はアイテム7〜アイテム8のケースのみ無視します。

アイデア?

+0

'(?m)^ Item 7([\ S \ s] *?)(?=^Item 8)'しかし、例を表示する必要があります。 – sln

+0

ブロックが2つあり、ToCがない場合はどうなりますか?それでは、どうやって掴むべきか教えてください。申し訳ありませんが、現在のところ、コンテキストルールを定式化するまで、この問題には解決策はありません。 –

答えて

0

私はこのことをお勧め:

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

これは[項目7 - アイテム8]の最後の見つけた文書のペアを。

Find関数を使ってNotepad ++ 6.9.2で正規表現オプション. matches newlineをチェックしています。

注:Find all in Current Documentボタンは、正規表現とは異なる解釈を使用しているようですが、否定の先読みは無視されているようです。この解決策はFind Nextボタンでのみ機能します。

+0

私はまだ、なぜこの正規表現が〜700行の1つの繰り返しブロックを持つドキュメントに[矛盾した結果](http://i.stack.imgur.com/olXcK.png)を表示するのかは分かりません。 [Notepad ++ v6.9.2] – revo

+0

Notepadd ++のバグのようです。私は正規表現を更新しましたが、大きなファイルでも 'Find Next'ボタンで動作するようですが、' Find All In Current Document'ボタンは異なった動作をしているようです。 – trincot

関連する問題