2017-06-26 8 views
1

だから私は、次のテキストを見しようとしています:マルチラインの正規表現 - 問題キャプチャ繰り返しグループ

This is some header 1 

nonsense text 1 


Repeated item 1 
Repeated item 1 Data 

nonsense text 1 


Repeated item 2 
Repeated item 2 Data 

This is some header 2 

nonsense text 1 

Repeated item 1 
Repeated item 1 Data 

nonsense text 1 

Repeated item 2 
Repeated item 2 Data 

私は繰り返しアイテムをキャプチャし、またそうのようにそれらを前のヘッダー内の数字を捕獲しようとしています:Eの、しかし

Repeated Item ([0-9]+)\sSome item data: (.*) 

This is some header 1 
Repeated item 1 
Repeated item 1 Data 
Repeated item 2 
Repeated item 2 Data 

This is some header 2 
Repeated item 1 
Repeated item 1 Data 
Repeated item 2 
Repeated item 2 Data 

私はこれを用いて繰り返しアイテムをキャプチャは問題がありませんACH繰り返しアイテム、私もこのようにそれの前にヘッダーをキャプチャする(しかし、この正規表現は動作しません):

This is some header ([0-9]+).*Repeated Item ([0-9]+)\sSome item data: (.*) 

私もちょうどこのテキストの上に1の誘導体である、次の正規表現を試してみました:

(?sm)This is some header ([0-9]+).*Repeated Item ([0-9]+)\sSome item data: (.*) 

ただし、上記の正規表現では、最初のヘッダーと最小繰り返しアイテムだけがキャプチャされます。正規表現を使って達成しようとしていることを達成する方法はありますか?私は明らかに手作業で行ごとにテキストを解析することができますが、私はこれを正規表現で実現できると期待しています。

+2

正規表現*で*を行うのはちょっとばかりですが、行ごとにテキストを解析する方がずっと良い方法です。あなたの時間を無駄にしないでください。 –

+0

@CasimiretHippolyte、あなたはこれを達成するために正規表現を使用する理由は愚かなアイデアを精緻化できますか?私はあなたにコメントしていただきありがとうございますが、アプローチAがアプローチBよりも優れている理由を説明せずにアプローチが愚かであると言うだけの価値はありません。 –

+0

キャプチャしようとしているものの例を追加してください。 'Repeated item'を含む全ての行? – dawg

答えて

0

ご例えば更新:

/^(This is some header \d+)[\s\S]+?^(Repeated item \d+)\s*^(Repeated item.*)[\s\S]+?(Repeated item \d+)\s*^(Repeated item.*)/m 

Demo

Perlの例:

$ txt='This is some header 1 
> 
> nonsense text 1 
> 
> 
> Repeated item 1 
> Repeated item 1 Data 
> 
> nonsense text 1 
> 
> 
> Repeated item 2 
> Repeated item 2 Data 
> 
> This is some header 2 
> 
> nonsense text 1 
> 
> Repeated item 1 
> Repeated item 1 Data 
> 
> nonsense text 1 
> 
> Repeated item 2 
> Repeated item 2 Data' 

$ echo "$txt" | perl -0777 -lne 'while (/^(This is some header \d+)[\s\S]+?^(Repeated item \d+)\s*^(Repeated item.*)[\s\S]+?(Repeated item \d+)\s*^(Repeated item.*)/gm) {print "$1\n$2\n$3\n$4\n$5\n\n" }' 
This is some header 1 
Repeated item 1 
Repeated item 1 Data 
Repeated item 2 
Repeated item 2 Data 

This is some header 2 
Repeated item 1 
Repeated item 1 Data 
Repeated item 2 
Repeated item 2 Data 

より堅牢なアプローチは、最初のブロックにテキストを打破して、分離することです繰り返す項目を削除します。

+0

あなたはそれを釘付けにしたい。ありがとうございました。 –

+0

ブロックが繰り返された回数がわからない場合はこれが可能ですか?ブロックが( "繰り返しitem2 \ nRepeated 2 Data")ですか?クエリは毎回2回繰り返されるこのシーケンスに依存するようです。 –

関連する問題