2016-05-05 8 views
1

検索するテキストがpqrであるとします。URLの一部ではないテキストを検索するにはどうすればよいですか?

"http://abc.zzz/pqr/xyz"  -> Should not match 
"/pqr/"      -> Should Match 
"pqr"       -> Should Match 
"http://abc.zzz/pqr/pqr/"  -> Should not match 
"http://abc.zzz/pqr/pqr/ pqr" -> Should match the last "pqr" 
"www.pqr.zzz"     -> Should not match 

私は私は試合としてそれを検討していた空である場合、私は、その後、group 1を探した

((?:(?:(?:https?|ftp|file|mailto):)|www)[^ ]+?)?(pqr) 

、次の正規表現を使用してみました。しかし、これは失敗しますhttp://abc.zzz/pqr/pqr/

一致するテキストがURLの一部でないかどうかを検出する上で、ここで助けてください?

私が思う最悪のケースは、最初にすべてのURLを検出し、一致するURLの開始および終了インデックスを保存することです。次に、pqrと一致させて、URLの一部であるものをすべて除外します。もっと良いことができるものがあれば、私は考えていました。

+0

'pqr'には何を一致させる必要がありますか?何かに置き換えますか?最も良い方法は、URLと(pqr)(代替グループ内で)を照合することです。 –

+0

私の場合、 'pqr'自体は常にURLの一部ではない正規表現です。 – pratZ

+0

私が思う最悪のケースは、すべてのURLを最初に検出し、一致するURLの開始および終了インデックスを格納することです。次に、 'pqr'にマッチさせて、URLの一部であるものをすべて除外してください。 – pratZ

答えて

2

Javaを使用していることを考慮すると、の制限付き幅広い検索ビヘイビアを使用して、Java正規表現エンジンがサポートすることができます。これは、パターン内の限定数量を制限する{n,m}を使用できることを意味します。今、Java 8 supports even * and + quantifiers inside a lookbehind(非公式ですが)、これはバグであり、次のバージョンで修正される可能性があります。このように、あなたには、いくつかの範囲を使用することができ、(リンクは以上の1Kのシンボルを含む可能性はありませんが、事実に基づく状況にそれを調整することができるよう)0 to 1000を言う:

(?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000})(?<!\bwww\.\S{0,1000})pqr 

regex demo

を参照してください。最初のlookbehind (?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000})は、pqrの前に完全なURLがないかどうかを確認し、(?<!\bwww\.\S{0,1000}) lookbehindはの前にwww.がないかどうかをチェックします。

関連する問題