2013-03-18 45 views
5

我一直在尋找如何編寫正則表達式以包含以指定短語開始的某些URL,同時排除另一個URL的問題時遇到了很多問題。正則表達式包含一件事但排除另一個

我們希望包括與啓動網頁:

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

但我們希望排除任何有/ sXXXXXXX在URL中 - 其中x是數字。

我寫了這個到目前爲止匹配下面的網址,但它的行爲非常奇怪。我應該使用lookaround還是什麼?

\/(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

可能的重複:http://stackoverflow.com/questions/3792367/excluding-strings-using-regex?rq=1 – m4573r 2013-03-18 21:00:54

+0

你正在使用哪個正則表達式引擎? – 2013-05-06 03:57:18

回答

2

您正處在正確的軌道上。負前瞻將做到這一點:

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

^錨字符串的開始。 (?!.*\/s\d+)表示"/sXXXXXXX"不能出現在字符串中的任何位置,其餘部分與您所需的起始令牌相匹配。

原因[^s[0-9]+]沒有工作是[^xyz]只匹配一個單個字符。你有效地說,你正在尋找任何不是"s""[""0-9"的組合,然後是"]"。例如"s[234[s]"

你需要在字符串的開頭放置負向視圖的原因是沒有任何東西可以匹配。如果你把它放在\/(womens|mens|kids\-clothing\/boys|kids\-clothing\/girls|homeware)\/.*之後,你仍然可以成功匹配"/sXXXXXXX"之前的所有內容。即對於您的數據的第1行,您將匹配「/ homeware/bathroom /」。

+0

真棒,完美的作品! 非常感謝您的解釋......我的腦海中圍繞着如何工作的方式有點困難。 – Ryan 2013-03-18 21:26:57

1

是的,你需要一個負環視:

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

如果你比較在一個時間,你不需要多(M)標誌一行。這可能表現很奇怪,因爲你有一個嵌套在方括號內的角色類(用方形表示),這不起作用;你不能嵌套字符類。這已經過測試並在refiddle上運行。

+0

這將失敗所有提供的輸入。 – 2013-03-18 21:11:36

+0

否定。正如我所指出的,我在refiddle上測試過它,它正常工作。你試過了嗎? – Adrian 2013-03-18 22:00:37

+0

是的,你是對的。我在答案結束時錯過了「+」號。抱歉。 +1。在我的辯護中,我剛剛醒來。 – 2013-03-18 22:38:21

相關問題