Regex: abbina tutto ma

Ho bisogno di una regex in grado di far combaciare tutto tranne una stringa che inizia con uno schema specifico (in particolare index.php e cosa segue, come index.php?id=2342343 )

Non un esperto di espressioni regolari, ma penso che potresti usare un lookahead negativo sin dall’inizio, ad esempio ^(?!foo).*$ Non dovrebbe corrispondere a nulla che inizi con foo .

Puoi mettere un ^ all’inizio di un set di caratteri in modo che corrisponda a qualsiasi cosa tranne quei personaggi.

 [^=]* 

abbinerà tutto ma =

Regex: abbina tutto tranne :

  • una stringa che inizia con uno schema specifico (es. any – vuoto, anche – stringa che non inizia con foo ):
    • Soluzione basata su Lookahead per NFA:
      • ^(?!foo).*$
      • ^(?!foo)
    • Soluzione basata sulla class di caratteri negata per motori regex che non supporta i lookaround :
      • ^(([^f].{2}|.[^o].|.{2}[^o]).*|.{0,2})$
      • ^([^f].{2}|.[^o].|.{2}[^o])|^.{0,2}$
  • una stringa che termina con uno schema specifico (ad esempio, nessun world. alla fine):
    • Soluzione basata sul look:
      • (?
      • ^.*(?
    • Soluzione POSIX:
      • ^(.*([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.])|.{0,5})$
      • ([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.]$|^.{0,5})$
  • una stringa contenente testo specifico (ad esempio, non corrisponde a una stringa che ha foo ) (nessun patern compatibile con POSIX, scusa):
    • ^(?!.*foo)
    • ^(?!.*foo).*$
  • una stringa contenente un carattere specifico (ad esempio, evitare di far corrispondere una stringa con un simbolo | ):
    • ^[^|]*$
  • una stringa uguale ad una stringa (per esempio, non uguale a foo ):
    • Lookaround-based:
      • ^(?!foo$)
      • ^(?!foo$).*$
    • POSIX:
      • ^(.{0,2}|.{4,}|[^f]..|.[^o].|..[^o])$
  • una sequenza di caratteri :
    • PCRE (corrisponde a qualsiasi testo tranne cat ): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i or /cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
    • Altri motori che consentono i lookaround: (cat)|[^c]*(?:c(?!at)[^c]*)* At (cat)|[^c]*(?:c(?!at)[^c]*)* (o (?s)(cat)|(?:(?!cat).)* , o (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]* ) e quindi verificare con linguaggio significa: se il Gruppo 1 corrisponde, non è quello che ci serve, altrimenti, prendi il valore della corrispondenza se non vuoto
  • un certo carattere singolo o un set di caratteri :
    • Usa una class di caratteri negata : [^az]+ (qualsiasi carattere diverso da una lettera ASCII minuscola)
    • Corrispondenza con qualsiasi carattere (i) ma | : [^|]+

Nota dimostrativa : la newline \n viene utilizzata all'interno di classi di caratteri negate nelle demo per evitare l'overflow della corrispondenza con le linee adiacenti. Non sono necessari durante il test delle singole stringhe.

Nota di ancoraggio : in molte lingue, usare \A per definire l'inizio non ambiguo della stringa, e \z (in Python, è \Z , in JavaScript, $ è OK) per definire la fine della stringa.

Nota del punto : in molti gusti (ma non in POSIX, TRE, TCL),. corrisponde a qualsiasi carattere ma un carattere di nuova riga . Assicurati di utilizzare un modificatore DOTALL corrispondente ( /s in PCRE / Boost / .NET / Python / Java e /m in Ruby) per . per abbinare qualsiasi carattere tra cui una nuova riga.

Backslash note : nelle lingue in cui devi dichiarare i pattern con stringhe C che consentono sequenze di escape (come \n per una nuova riga), devi raddoppiare i backslash di caratteri speciali in modo che il motore possa trattarli come caratteri letterali (ad esempio in Java, world\. sarà dichiarato come "world\\." , o usare una class di caratteri: "world[.]" ). Utilizza i valori letterali stringa raw (Python r'\bworld\b' ), letterali stringa letterale C # @"world\." , o stringhe letterali con stringhe / regex come /world\./ .

In python:

 >>> import re >>> p='^(?!index\.php\?[0-9]+).*$' >>> s1='index.php?12345' >>> re.match(p,s1) >>> s2='index.html?12345' >>> re.match(p,s2) <_sre.SRE_Match object at 0xb7d65fa8> 

Basta abbinare /^index\.php/ quindi rifiutare qualsiasi cosa lo corrisponda.

grep -v nella shell

! ~ in perl

Per favore aggiungi altro in altre lingue: l’ho contrassegnato come Wiki della community.

Che dire di non usare regex:

 // In PHP 0 !== strpos($string, 'index.php')