2012-02-16 4 views
0

コンテンツはテキストとリンクで構成されます。一部のリンク(一部のみ)はパターン#PARAM1[\w+]#PARAM2[\w+]#PARAM3[\w+]で終了する場合があります。 PARAM3はオプションです。例えば、URLにURLが特定の方法で終了し、順序が無視される場合にのみ一致する

http://www.google.com 

を与えられたパターンが一致していなければならない、次の中一つが一致する必要があります:

http://www.google.com#PARAM1[\w+]#PARAM2[\w+]#PARAM3[\w+] 
http://www.google.com#PARAM1[\w+] 
http://www.google.com#PARAM1[\w+]#PARAM2[\w+] 
http://www.google.com#PARAM3[\w+]#PARAM2[\w+]#PARAM1[\w+] 

などがあります。 URL自体のために、私は私のニーズには十分で、次の正規表現、使用しています:

\b(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])? 

を私の質問は、どのように私は試合中に含まれる追加のパラメータを提供することができています。私は肯定先読みを使用しようとしました:

\b(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?((?=.*#ID\[\w+\])(?=.*#NAME\[\w+\])(?=.*#TAG\[\w+\])) 

しかし、一致する文字列には、先読みが含まれていないため、URLのみが含まれています。これには簡単な解決策が必要です。 :)

私はそれを助ける場合、私はこれのためにJavaを使用しています。

答えて

0

これは十分厳密ではないかもしれませんが、データがあなたの例を超えて変わった場合、動作しないかもしれませんが、私は刺し傷を取って次のRegexを考え出しました。それはファンシー側のほうが少なく、ブルートフォース側ではそれほど多くありません。

\b(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+(?:(\#PARAM(?:2|3)\[\\w\+])?(\#PARAM1\[\\w\+])(\#PARAM(?:2|3)\[\\w\+])?|(\#PARAM(?:2|3)\[\\w\+]){0,2}(\#PARAM1\[\\w\+])|(\#PARAM1\[\\w\+])(\#PARAM(?:2|3)\[\\w\+]){0,2})$ 

私はあなたの正規表現の最初の部分を取り、その後、オプションのPARMSに関連して必要なPARM1の可能な位置に対応する3つの選択肢にマッチする正規表現追加:

  1. オプションPARM2を/ 3、必須PARM1、オプションPARM2/3
  2. オプションPARM2/3、オプションPARM2/3、必要なPARM1
  3. 必須PARM1、オプションPARM2/3、オプションPARM2/3

代替案にはいくつかの重複があります。たぶんもっと考えれば、少し単純化することが可能かもしれません。

前述したように、オプションのparmsを一意にする必要はないため、厳密ではない場合があります。 、私は徹底的にテストしていない[+ wは\]

を[+ W \] //www.google.com#PARAM1#PARAM3 [\ + W]#PARAM3の:

にhttp:これと同様のバリエーションが通過しますもちろん、他にもいくつかのバグがあるかもしれませんが、これが助けになります。

0

男、私は正規表現の男です。URLマッチャーを拡張しようとはしません。最初にURLを実行した後で特別なパターンを実行できませんか?

 string verifiedURL = @"http://www.google.com#PARAM3[\w+]#PARAM1[\w+]"; 
     //match (at least)1, or 2 or 3 occurrences of the PARAM sequence 
     var pattern = @"(#PARAM\d\[\\w\+\])(#PARAM\d\[\\w\+\]){0,2}"; 
     var matches = Regex.Matches(verifiedURL , pattern); 
関連する問題