2013-03-18 9 views
5

dışlamak için.Regex bir şey içerir ama başka hariç ederken, belirli bir ifade ile başlayan belirli URL'lerin dahil için bir normal ifade nasıl yazılacağını bulmakta sahip oldum başka

Biz başlamak sayfaları dahil etmek istiyorum:

/womens 
/mens 
/kids-clothing/boys 
/kids-clothing/girls 
/homeware 

Ama URL'ye/sXXXXXXX sahiptir şey dışlamak istediğiniz - X'in sayılardır.

aşağıda URL'ler maç için şimdiye kadar bu yazdım ama çok tuhaf davranıyor. Göz atmak veya başka bir şey mi kullanmalıyım?

\/(womens|mens|kids\-clothing\/boys|kids\-clothing\/boys|homeware).*[^s[0-9]+].* 

/homeware/bathroom/s2522424/4-tier-pastel-pop-drawers-approx-91cm-x25cm-x-28cm 
/homeware/bathroom/towels-and-bathmats 
/homeware/bathroom/towels-and-bathmats/s2506420/boutique-luxury-towels 
/homeware/bathroom/towels-and-bathmats?page=3&size=36&cols=4&sort=&id=/homeware/bathroom/towels-and-bathmats&priceRange[min]=1&priceRange[max]=14 
/homeware/bathroom?page=3&size=36&cols=4&sort=&id=/homeware/bathroom&priceRange[min]=1&priceRange[max]=35 
/homeware/bedroom 
/homeware/bedroom/bedding-sets 
/homeware/bedroom/bedding-sets/s2471012/striped-reversible-printed-duvet-set 
/homeware/bedroom/bedding-sets/s2472706/check-printed-reversible-duvet-set 
/homeware/bedroom/bedding-sets/s2475332/union-jack-duvet-set 
/kids-clothing/boys/shop-by-age/toddler-3mnths-5yrs/s2520246/boys-lollipop-slogan-t-shirt 
/kids-clothing/boys/shop-by-age/toddler-3mnths-5yrs/s2520253/boys-2-pack-dinosaur-t-shirts 
/kids-clothing/girls/great-value/sale?page=1&size=36&cols=4&sort=price.asc&id=/kids-clothing/girls/great-value/sale&priceRange[min]=0.5&priceRange[max]=7 
/kids-clothing/girls/mini-shops/ballet-outfits 
/kids-clothing/girls/shop-by-age/baby--newborn-0-18mths 
/kids-clothing/girls/shop-by-age/baby--newborn-0-18mths/s2484120/3-pack-frill-pants-pinks 
/kids-clothing/girls/shop-by-age/baby--newborn-0-18mths/s2504431/3-pack-l-s-bodysuit 
/mens/categories/tops?page=5&size=36&cols=4&sort=&id=/mens/categories/tops&priceRange[min]=2&priceRange[max]=22.5 
/mens/categories/trousers-and-chinos 
/mens/categories/trousers-and-chinos/s2438566/easy-essential-cuffed-jogging-bottoms 
/mens/categories/trousers-and-chinos/s2438574/easy-essential-cuffed-jogging-bottoms 
/mens/categories/trousers-and-chinos/s2458939/regatta-zip-off-lightweight-outdoor-trousers 
+1

Olası kopya: http://stackoverflow.com/questions/3792367/excluding-strings-using-regex?rq=1 – m4573r

+0

Hangi normal ifade motoru kullanıyorsunuz? –

cevap

2

Doğru yoldasınız. Bir Negatif ilerleme yapacağız:

"^(?!.*\/s\d+)\/(womens|mens|kids\-clothing\/boys|kids\-clothing\/girls|homeware)\/.*" 

^ çapa dize başlangıcına. (?!.*\/s\d+), "/sXXXXXXX"'un dizede herhangi bir yerde görünemeyeceği ve geri kalanının gerekli başlangıç ​​belirteçlerinizle eşleştiği anlamına gelir. işe yaramadı

nedeni [^s[0-9]+] o [^xyz] maçlar tek tek karakterdir. Ne etkili söylüyorsun sen "]" ardından "s", "[" ve "0-9" herhangi bir kombinasyonu olmayan herhangi karakteri, aradığımız vardır. Örneğin. "s[234[s]".

Eğer dizesinin başında negatif ileri yönlü koymak gerekir nedeni

yüzden hiçbir şey eşleşti olmasıdır. \/(womens|mens|kids\-clothing\/boys|kids\-clothing\/girls|homeware)\/.*'dan sonra koyarsanız, yine de "/sXXXXXXX"'dan önce her şeyi başarıyla eşleştirirsiniz. Yani verilerinizin 1. satırı için "/ homeware/bathroom /" ile eşleşirsiniz.

+0

Harika, mükemmel çalışıyor! Çok açıklama için bu kadar Teşekkür ... çalışmalarını lookarounds etrafında başımı sarma zorluğu biraz başlamıştı. – Ryan

1

Evet, bir negatif çevre bakışına gerekir:

/^\/(womens|mens|kids\-clothing\/boys|kids\-clothing\/boys|homeware)(?:\/(?:(?!s\d+).)*)+$/gm 

Eğer satırlı (m) bayrağı gerekmez seferinde bir satır karşılaştırıyorsanız. Muhtemelen garip bir davranış sergiliyor çünkü daha fazla köşeli parantez içine yerleştirilmiş bir karakter sınıfına sahiptiniz. Karakter sınıflarını yuvalayamazsınız. Bu test edildi ve refiddle üzerinde çalışıyor.

+0

Bu, sağlanan tüm girdiler için başarısız olur. –

+0

Negatif. Daha önce de belirttiğim gibi, test ettim ve test ettim. Onu denedin mi? – Adrian

+0

Evet, haklısınız. Cevabınızın sonunda '+ 'yı özledim. Afedersiniz. +1. Savunmada, henüz uyandım. –

İlgili konular