2016-09-04 3 views
0

rubularにアップロードした次の正規表現からいくつかのフィールドを解析する際に問題が発生しています。私が解析している文字列は、FTPサーバのバナーの特別なヘッダです。しかし、残念ながら、これは私だけ最後のマッチを与え、私は私を遅延キャプチャしようとしているとして、なぜわからない、(?i)^special(:[pmu](.*?)\^)?*は、トリックを行うだろう:私はこのバナー、私はと考え正規表現から複数のグループを解析する

special:pTXT1TOCAPTURE^:mTXT2TOCAPTURE^:uTXT3TOCAPTURE^ 

ラインを処理するためには各グループ。また、私は元の一致文字列が含まれている場合、すなわち、また、空の文字列をキャプチャすることができなければならないことに注意してください:uと^

ラップの言葉がすべて表示するRubyのバージョン マッチ結果不可視: 特別:pTXT1TOMATCH ^:mTXT2TOMATCH ^:uTXT3TOMATCH^ マッチグループ:

  1. :uTXT3TOMATCH^
  2. TXT3TOMATCH

アイデアは行がテスト '特別' までの3 CAに続いて開始しなければならないということですp、m、またはuで区切られたグループは、次の^記号まで遅延しています。私は上記のテキストをキャプチャする必要があります - 基本的に私はTXT1TOCAPTURE、TXT2TOCAPTURE、TXT3TOCAPTUREを見つける必要があります。これらの3つのキャプチャグループの少なくとも1つが存在する必要があります。

(?:(?:^special:)|\G(?!\A)\^:)[pmu]([^^]+) 

はそれがrubular.comに取り組んでください:あなたは\G修飾子を持っている場合があります事前

+0

それはRubyのであれば、PCREタグは何ですか? – revo

+0

実際には、式はpcreに準拠する必要があります - 実際のランタイムは私のPC上でpcreを使用します。私はそれを明確にすべきだった。 – johnco3

答えて

1

RegExには2つの問題があります.1つは構文で、もう1つは概念です。構文

は、我々はPCREに、このような修飾?*を持っていないが、それは欲張りな量指定子を示しRubyで*に等しいです。キャプチャグループに適用する場合、最後のマッチをキャプチャします。

概念:試合を続けをご提供していません.*?怠惰な量指定子を使用して

。それはエンジンが満足すると直ちに停止します。 g修飾子が次の一致にある間は、最後の一致の次の位置には^specialが存在しないため、決して発生しません。

ソリューションは、前の試合の終わりに開始マッチングのその平均から利益を得る\Gトークンを使用している:

(?:special|(?!\A)\G):([pmu][^^]*\^) 

Live demo

+0

OPに関する私のコメントを見れば、あなたの答えより古いことが分かります。つまり、私は以前に疑問を見つけ、おそらく何かを書くことに決めました。あなたの質問に答えて、あなたがよく見れば、詳細を提供してくれるでしょう*。あなたのRegExはまた、私の代わりにOPの要件*完全に*を満たしていません。 @Jan – revo

+0

(?:^ special |(?!\ A)\ G)の仕組みを理解できますか?特に私は(?!\ A)\ G '構文に慣れていません。ライブデモの上にマウスを置くと、その動作についてはあまり明確ではありません。 – johnco3

+0

エンジンが最初の場所で文字列の先頭でマッチしようとすると、 '^ special'と見なされ、マッチしてパターンの残りの部分が続きます。満足のいく* walk *の後に 'g'修飾子をオンにしておく必要があります。これは、以前のwalkが正常に終了した場所(' pTXT1TOCAPTURE^'の直後)から続きます。新しいマッチエンジンを開始するには、RegExの最初から再び開始します。それは '^ special 'にぶつかるが、文字列でそれを見ず、交互の第2の側に行くと'(?!\ A)\ G'と見えて一致する。 '\ G'は文字列の先頭を意味する* OR *前の一致の終わり*。 – revo

0

感謝。

関連する問題