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 ignoremeignoreme2 ) 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.