2013-12-19 3 views
0

Пытается написать регулярное выражение, соответствующее определенным URL-адресам. Для наших целей, давайте предположим, что URL-адреса являются:Regex: сопоставление одной подстроки, но за исключением другой подстроки позже

http://website.com/Section/subsection/Cows 
http://website.com/Section/Cows 
http://website.com/Section/subsection/Chickens 

Я хочу, чтобы соответствовать:

  • URL-адреса, содержащие/Раздел/
  • Если это не сопровождается/Цыплята

Самое близкое, что я получил: /\/Section\/([a-zA-Z0-9]+)\/(?!Chickens)/gi

Это работает для первого URL-адреса, bu t второй URL-адрес не будет сопоставлен. Я знаю, потому что у него нет раздела [a-zA-z0-9]+, но я не знаю, как его решить.

+1

'url.indexOf ('/ Раздел') = -1 && url.indexOf ('/ Chickens ')! = -1' – adeneo

+0

Вам нужно убедиться, что его действительный URL-адрес? Если это так, вам понадобится гораздо большее регулярное выражение. Я бы использовал код URL-адреса другого пользователя, а затем сделал то, что предлагает @adeneo. – acbabis

ответ

3

Вы были очень близки. Вот регулярное выражение:

\/Section\/(?!.*\/Chickens) 

Это просто соответствует разделу части, а затем утверждает, что ничего следует «/ Цыплята» может не совпадать идти вперед.

Вы можете связать регулярное выражение с дополнительным .* (вне негативного отображения), если вы хотите, чтобы он захватил URL-адрес вместо того, чтобы просто тестировать его для соответствия.

0

Вы близко. Попробуйте это регулярное выражение:

/\/Section\/([a-z0-9]+)(?!\/Chickens)/gi 
0

Это один отвергает "/ раздел/Куры", а:

var r = /\/Section\/(?!(.+\/)*Chickens(\/|\?|#|$))/; 
r.test('/Section/Cows'); // true 
r.test('/Section/Chickens'); // false 
r.test('/Section/CowsChickens'); // true 
r.test('/Section/ChickensCows'); // true 
r.test('/Section/Cows/Chickens'); // false 
r.test('/Section/Cows/Cows/Chickens'); // false 
r.test('/Section/Cows/Chickens/Cows'); // false 
Смежные вопросы