Un'espressione regolare per escludere una parola / stringa


299

Ho un'espressione regolare come segue:

^/[a-z0-9]+$

Questo corrisponde a stringhe come /helloo /hello123.

Tuttavia, vorrei escludere un paio di valori di stringa come /ignoremee /ignoreme2.

Ho provato alcune varianti ma non riesco a far funzionare nessuna!

Il mio ultimo debole tentativo è stato

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

Qualsiasi aiuto sarebbe apprezzato con gratitudine :-)


Risposte:


376

Ecco ancora un altro modo (usando un aspetto negativo ):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

Nota: C'è una sola espressione cattura: ([a-z0-9]+).


1
Fantastico, sembra aver fatto il trucco. In realtà ho bisogno di questa regola per la riscrittura dell'URL e volevo ignorare la cartella "images", "css" e "js". Quindi la mia regola è la seguente: ^ / (?! css | js | images) ([az] +) /? (\? (. +))? $ E riscrive in /Profile.aspx?id=$1&$3 Questa regola funzionerà correttamente e propagherà anche la stringa di query? Quindi, se qualcuno visita mydomain.com/hello?abc=123, mi piacerebbe riscriverlo su mydomain.com/Profile.aspx?id=hello&abc=123 . Sono anche un po 'incerto sulle prestazioni di (. +) A la fine per acquisire la stringa di query nella richiesta originale.
— rom

Sembra che questa sia un'altra domanda. La regexp che hai sembra catturare la stringa di query - test e vedere se arriva la tua stringa di query. Inoltre - (\?(.+))?$dovrebbe essere veloce. Non mi preoccuperei troppo della velocità.
— Seth,

1
Questo non ha funzionato per me, mentre la soluzione di Alix Axel ha funzionato. Sto usando la java.util.regex.Patternclasse di Java .
— Mark Jeronimus,

1
Confermo Mark's reMark;) - per esempio, Pycharm è basato su Java, non è vero? Quindi, considerando le regex nella ricerca di Pycharm, la soluzione di Alix funziona, l'altra no.
— Fanny

43

Questo dovrebbe farlo:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

Puoi aggiungere tutte le parole ignorate che vuoi, ecco una semplice implementazione di PHP:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);

pensavo che guardare dietro richiedesse uno schema a larghezza fissa?
— simon,

2
@AlixAxel Lo fa, ma le librerie regex più intelligenti consentiranno un'alternanza con lunghezze variabili per le alternative (e usano il più lungo), purché ogni alternativa abbia una lunghezza fissa.
— ChrisF,

questo è intelligente, ma fallisce per me se la parola ignorata si trova alla fine di qualsiasi altra parola. cioè se aggiungi 'a' come una delle parole ignorate, allora qualsiasi parola che termina in a viene ignorata
— singmotor

21

Se vuoi escludere entrambe le parole, hai bisogno di una congiunzione:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

Ora entrambe le condizioni devono essere vere (né è consentito ignoreme né ignoreme2 ) per avere una corrispondenza.


1
Ciò equivale a quello più corto sopra che è uno sguardo negativo di una serie di alternative.
— ChrisF,

4
@ChrisF No, non proprio. La soluzione di Seth non corrisponderebbe a qualcosa di simile /ignoremenotpoiché /è seguita da ignoreme.
— Gumbo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.