2016-07-15 5 views
2

post、またはpost put、さらにはget put postのように見える文字列があることが課題です。これらはすべて一致しなければなりません。好ましくは、[space]postまたはget[space]のような逸脱をマッチさせるべきではない。以前のキャプチャグループに基づいてRegexをマッチさせる方法はありますか?

は現在、私は、私は二回(post|put|delete|get)を指定する必要がありましたので、しかし、私は、それに満足していないよ、この

^(post|put|delete|get)(()(post|put|delete|get))*$ 

を思い付きました。 post postのような重複にもマッチします。

私は何とか最初のグループに逆参照(?)を使用したいので、同じ条件を2回指定する必要はありません。

はしかし、後方参照 \1は、たとえば、私 のみ試合 post post役立つだろう、それは私が何をしたいの反対です。私は ではなかった最初のキャプチャグループの単語に一致するようにしたいと思います以前に文字列に見つかりました。

これも可能ですか?私はSOの質問を見てきましたが、私のGoogle-fuは私を逃しています。

+2

試した['^(post | put | delete | get)((?!\ 1)(?1))* $'](https://regex101.com/r/aR0tA4/1)?それはPCREで動作します。あなたの正規表現の味は何ですか?この場合、どの言語/正規表現ライブラリを使用しているかを知ることは重要です。 –

+0

@WiktorStribiżew...私は '(?1)'を逃してしまった - 私はそれが存在することさえ知りませんでしたが、明らかに、それは否定的な先読みとは別に、この解決策の鍵です。答えとして投稿すると、私はそれを受け入れます。 – EpicPandaForce

+0

受け入れられた答えのための注意:本当の、フレーバーは本当に正規表現エンジンで問題ですので、Javascriptでは、再帰的サブルーチン呼び出しを[最初の呼び出しといくつかのマイナーな調整](https://regex101.com/r/)に置き換える必要があります(post!put | delete | get)(?!。* \ 4))* $ ' – EpicPandaForce

答えて

4

PCREベースの正規表現エンジンを使用している場合は、(?n)のようにsubroutine callsを使用して、サブパターンを再帰的に使用することができます。

^(post|put|delete|get)((?!\1)(?1))*$ 
           ^^^^ 

regex demo

式がの詳細を参照してください:

  • ^ - 文字列
  • (post|put|delete|get)の開始を - グループ1リテラルストリング
  • ((?!\1)(?1))*として選択肢の1に一致します - 0またはmor E列: - スペース
  • (?!\1) - 現在の場所の後のテキストが原因\1
  • (?1)backreferenceに、グループ1に取り込まものと同一である場合、一致を失敗したnegative lookahead -
    • subroutine callを第1の捕捉基(すなわち、それは、グループ1で使用したのと同じパターン)を使用しています
  • $ - 文字列の最後

UPDATE

get post postのように一致する文字列を避けるために、あなたも否定先読みを追加する必要がありますグループ1に変換し、グループ1に取り込まれたのと同じ値に一致させたくないことをサブルーチン呼び出しが認識するようにしました。

^((post|put|delete|get)(?!.*\2))((?1))*$ 

regex demo

違いは、我々はグループ2に交代をキャプチャし、私たちは、文字列で、さらに撮影した単語のいずれかの発生を許可しないように否定先読み(?!.*\2)を追加することです参照してください。 ((?1))*は元のままです。サブルーチンは、キャプチャグループ1のサブパターン全体を先読みして再帰します。

+0

これは美しいです、ありがとう。私は正規表現でサブルーチン呼び出しについて知りませんでした。 – EpicPandaForce

+1

多くの正規表現のフレーバでは利用できないことに注意してください。 Rubyでは、 '(?N)'の代わりに '\ g 'を使うことができますが、.NETでは同じ方法がありません。 –

+0

ちょっと待ってください、それは軽微な問題があるようです。どうやらそれは 'post post'にはマッチしませんが、' get post post'にマッチします(それはすべきではありません)。 2番目のケースで 'post'の2番目の出現にどうしてもマッチしないようにする方法はありますか?どうやら、繰り返し単語が「コントロールグループの最初の一致と同じではない」ので、「get post get」は一致しないが、「post post put post」は一致するように見える。 – EpicPandaForce

関連する問題