2017-02-22 10 views
2

考えると、TE、以下の文字列:抽出フォルダと正規表現グループの秩序を保つそのまま

/folder/subfolder/all 
/folder/subfolder/all?a=b 
/folder/anothersubfolder/all?a=b 
/folder/all 
/folder/all?a=b 
/folder/anothersubfolder 
/folder/anothersubfolder/all 
/folder 

サブフォルダは「すべて」は、定義済みで、または文字列内に存在しない可能性があり、他のサブフォルダからseperatetly抽出する必要があります。

^\/(folder)(\/[^/?]*)?(\/[^/?]*)?(\?.*)?$ 

のような正規表現は、私のために動作しません。異なるフォルダを含むグループは修正する必要があります。これは、サブフォルダはRegexで「すべて」のいずれかでグループ2または3

で正規表現の結果のようなものでなければなりません:のみ「/フォルダ」することができ、必須/フォルダ(:

  • グループ1を)
  • グループ2:/サブフォルダ( "/全")
  • グループ3以外の任意の文字列であることができるオプション:/すべての(のみとすることができるオプションの "/すべて")
  • グループ4:A = B(任意のパラメータの任意のセット)
+0

"folder"は、その内容が常に同じであるため、グループ化すると便利ではないように注意してください。 – Aaron

答えて

1

^\/(folder)((?:\/(?!all)[^/?]*)?)((?:\/all)?)((?:\?.*)?)$

[["folder", "/subfolder",  "/all", "" ], 
["folder", "/subfolder",  "/all", "?a=b"], 
["folder", "/anothersubfolder", "/all", "?a=b"], 
["folder", "",     "/all", "" ], 
["folder", "",     "/all", "?a=b"], 
["folder", "/anothersubfolder", "",  "" ], 
["folder", "/anothersubfolder", "/all", "" ], 
["folder", "",     "",  "" ]] 

ここでは二つの主なトリックがあります。

  1. 試合にしがみつくが、それでも凝集正規表現の部分のためにそれを使用しない正規表現エンジンを伝える非キャプチャグループ?:は、一緒に。それは、((?:stuff)?)のようなものを行うことができます。これは、空にすることができる必須のグループになります。

  2. 負の先読み?!これは正規表現に特定のパターンと一致しないように指示します。したがって、この場合、(?!all)は、「すべて」は第2のディレクトリブロックに存在できないと言います。 (注:これは2番目のディレクトリが "all"で始まらないことを意味します)

+0

同じ結果に対して、 '((:\/all)?)'を '(\/all)? 'に単純化できると思いますが、結果を空文字列からnull /言語。 @Aaron、正確には – Aaron

+0

です。空文字列とnull/undefinedの間の選択です。それはOPの方が良いかどうかによって決まります。 – user12341234

関連する問題