2013-03-18 21 views
5

特定のフレーズで始まる特定のURLを含む正規表現を作成し、別の正規表現を除外する方法を見つけるのは難しいことでした。ある正規表現を含むが別の正規表現を除外する正規表現

私たちは、で始まるページに含める:

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

しかし、私たちはURLで/ sXXXXXXX持って何も除外したい - Xは数字です。

以下のURLと一致するようにこれまでにこれを書いていますが、非常に奇妙な動作です。私はルックアラームなどを使用すべきでしょうか?

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

+0

どの正規表現エンジンを使用していますか? –

答えて

2

あなたは正しい方向にあります。否定先読みはそれを行います。

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

^アンカー文字列の先頭に。 (?!.*\/s\d+)は、"/sXXXXXXX"が文字列のどこにも表示されず、残りの部分が必要な開始トークンと一致することを意味します。

[^s[0-9]+]が機能しなかったのは、[^xyz]が1文字に1文字しか一致しないためです。あなたが効果的に言っているのは、"s""[""0-9"の組み合わせではない文字を探していて、その後に"]"があることを探しているということです。例えば"s[234[s]"

ネガティブな先読みを文字列の先頭に置く必要がある理由はまったく一致しません。 \/(womens|mens|kids\-clothing\/boys|kids\-clothing\/girls|homeware)\/.*の後ろに置くと、"/sXXXXXXX"の前のすべてのものと正常に一致します。つまり、データの1行目の場合は、「/ homeware/bathroom /」に一致します。

+0

素晴らしいです、完璧に動作します! あまりにも説明のためにあまりにも...私の頭をラップアラウンドの仕方で包み込むのに少し難しかったです。 – Ryan

1

はい、あなたは負の前後参照必要があります:あなたは複数行(M)フラグを必要としません一度に一つのラインを比較している場合は

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

を。それはおそらくあなたが文字クラス(角カッコで示されている)が大括弧の中にネストされていてうまくいかず、動作しません。文字クラスをネストすることはできません。これはテストされ、苦労して動作します。

+0

これは、指定されたすべての入力に対して失敗します。 –

+0

ネガティブ。私が指摘したように、私はそれをテストして、それを正しくテストしました。それを試しましたか? – Adrian

+0

あなたは正しいです。私はあなたの答えの最後に '+'を見逃しました。ごめんなさい。 +1。私の防衛の中で、私は目を覚ましたばかりだった。 –