2013-03-18 13 views
5

Ho avuto un sacco di problemi nel trovare come scrivere una espressione regolare per includere determinati URL che iniziano con una frase specificata mentre ne escludono un'altra.Regex per includere una cosa ma escludere un'altra

vogliamo includere le pagine che iniziano con:

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

ma vogliamo escludere tutto ciò che ha/sXXXXXXX nell'URL - dove le X sono numeri.

Ho scritto questo finora per abbinare gli URL di seguito, ma si comporta in modo molto strano. Dovrei usare lookaround o qualcosa del genere?

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

Possibile duplicato: http://stackoverflow.com/questions/3792367/excluding-strings-using-regex?rq=1 – m4573r

+0

Quale motore di espressioni regolari stai utilizzando? –

risposta

2

Sei sulla strada giusta. Un lookahead negativo lo farà:

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

I ^ ancore per l'inizio della stringa. (?!.*\/s\d+) significa che "/sXXXXXXX" non può apparire in nessuna parte della stringa e il resto corrisponde ai token di inizio richiesti.

Il motivo [^s[0-9]+] non ha funzionato è che [^xyz] corrisponde a un solo carattere. Quello che stai effettivamente dicendo è che stai cercando un personaggio che non sia una combinazione di "s", "[" e "0-9", seguito da "]". per esempio. "s[234[s]".

Il motivo per cui hai bisogno di mettere il tuo lookahead negativo all'inizio della stringa è che quindi non c'è nulla che corrisponda. Se lo metti dopo lo \/(womens|mens|kids\-clothing\/boys|kids\-clothing\/girls|homeware)\/.*, avresti comunque abbinato correttamente tutto prima dello "/sXXXXXXX". Ad esempio, per la riga 1 dei tuoi dati, dovrai abbinare "/ homeware/bathroom /".

+0

Impressionante, funziona perfettamente! Grazie mille anche per la spiegazione ... Stavo avendo un po 'di difficoltà a sistemare la mia mente su come funzionano i lookaround. – Ryan

1

Sì, avete bisogno di un Lookaround negativo:

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

Se si sta confrontando una riga alla volta non è necessario il (m) bandiera multilinea. Probabilmente si sta comportando in modo strano perché hai avuto una classe di caratteri (denotata da brakcet quadrati) annidati all'interno di parentesi quadre, che non funziona; non puoi nidificare classi di caratteri. Questo è stato testato e funziona su refiddle.

+0

Ciò non riuscirà per tutto l'input fornito. –

+0

Negativo. Come ho notato, l'ho testato su refiddle e ha funzionato correttamente. Hai provato? – Adrian

+0

Sì, hai ragione. Ho perso il '+' alla fine della tua risposta. Scusate. +1. A mia difesa, mi ero appena svegliato. –

Problemi correlati