2016-05-05 3 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 

Я попытался с помощью следующего регулярного выражения,

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

Я тогда искал group 1, если он пуст, то я рассматриваю это как спичку. Но это не удается для 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, вы можете использовать с ограниченной шириной lookbehind, поддерживаемый механизмом Java regex. Это означает, что вы можете использовать {n,m} ограничивающий квантификатор в шаблоне. Прямо сейчас, Java 8 supports even * and + quantifiers inside a lookbehind (хотя и неофициально), но это ошибка и, скорее всего, будет исправлена ​​в следующей версии. Таким образом, вы можете использовать некоторый диапазон, скажем 0 to 1000 (эта ссылка может содержать более 1K символов нет, но вы можете настроить его к фактической ситуации):

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

Смотрите regex demo

first lookbehind (?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000}) будет проверять, не должен ли pqr полный URL-адрес, и (?<!\bwww\.\S{0,1000}) lookbehind проверит, не стоит ли pqrwww..