2017-09-19 17 views
1

2つのパターンセットのテキストブロックに一致する正規表現を作成しようとしましたが、できませんでした。パターンは2つのパターンセットの間のすべてのテキストに一致します

テキストブロックには、「####」または「****」のシーケンスを含めることができます。 :繰り返しの回数は、例えば、ブロック、テキストが

************ 
test 1 
test 2 
test3 
############ 
x1 
x2 
x3 
############ 
a1 
a2 
a3 
***** 
b1 
b2 
b3 
*********************** 
c1 
c2 
c3 

###################### 

d1 
d2 
d3 

正規表現マッチグループは

結果はこのように見える必要が私にすべてのブロックを与えることができる必要があり、このようになります。2

分です

Block1: 

test 1 
test 2 
test3 

block 2: 

x1 
x2 
x3 

Block 3: 

a1 
a2 
a3 

block 4: 
b1 
b2 
b3 

block 5: 
c1 
c2 
c3 

block: 6 
d1 
d2 
d3 

私の努力は、これまでこのようなルックスになります:

正規表現:^.*#{2,}\s*(.*)(?=$)|^.*\*{2,}\s*(.*)(?=$)

関連するテキストとフィドル:https://regex101.com/r/ghgNbs/1/

すべてのヘルプは本当に素晴らしいことです! DOTALLとMULTILINEは、上の各モード -

+1

https://regex101.com/r/mYoYd4/1 –

+0

すごい....おかげでチームメイトを参照してください – Navyseal

+0

私は2つのオプションと説明で回答を掲載しました。 –

答えて

1

あなたは

(?sm)^(?:!#{2,}|\*{2,})\s*(.*?)(?=^(?:!#{2,}|\*{2,})|\Z) 

regex demo

詳細

  • (?sm)を参照してくださいようになりますDOTALL修飾子と怠惰なドットマッチングパターンを使用することができます
  • ^ - (原因(?m)に)行の先頭
  • (?:!#{2,}|\*{2,})から!が2以上#に続く、または2つの以上の*文字
  • \s*どちらか - 0+空白
  • (.*?) - グループ1(あなたが必要なもの):可能
  • (?=^(?:!#{2,}|\*{2,})|\Z)限り少ない任意の0+文字、 -
    • ^必要肯定先読み - ラインの開始(による(?m)
    • (?:!#{2,}|\*{2,})
    • は - または
    • \Z - - ストリングの両端!は2以上#、又は2以上*文字
    • |
    • と続きます。

しかし、パターンがかなり消費するリソースされ、それをアンロールすることをお勧めします。私はお勧めします

(?m)^(?:!#{2,}|\*{2,})\s*(.*(?:\R(?!(?:!#{2,}|\*{2,})).*)*) 

注:今回はDOTALL修飾子はありません。regex demoを参照してください。

詳細

  • (?m)^(?:!#{2,}|\*{2,})\s* -
  • (.*(?:\R(?!(?:!#{2,}|\*{2,})).*)*)上記と同じ - グループ1(あなたの期待された結果がここにある):
    • .* - 任意の0+改行文字以外の文字、可能な限り多く(全行)
    • (?:\R(?!(?:!#{2,}|\*{2,})).*)* - 0以上のシーケンス:
      • \R(?!(?:!#{2,}|\*{2,})) - !と2+ # Sまたは2+ * S
      • .*で追跡されていない改行(\R(?:\r\n?|\n)と類似で置き換えることができる) - 任意の0+改行文字以外の文字、できるだけ多く(全ライン)
関連する問題