Regex: combina tudo, mas

Eu preciso de um regex capaz de combinar tudo, mas uma seqüência de caracteres começando com um padrão específico (especificamente index.php e o que se segue, como index.php?id=2342343 )

Não é um especialista em regexp, mas eu acho que você poderia usar um lookahead negativo desde o começo, por exemplo ^(?!foo).*$ Não deveria combinar com nada começando com foo .

Você pode colocar um ^ no início de um conjunto de caracteres para corresponder a qualquer coisa, menos esses caracteres.

 [^=]* 

vai combinar tudo, mas =

Regex: combina tudo menos :

  • uma string começando com um padrão específico (por exemplo, any – empty, too – string não iniciando com foo ):
    • Solução baseada em lookahead para NFAs:
      • ^(?!foo).*$
      • ^(?!foo)
    • Solução baseada em class de caractere negada para mecanismos de regex que não suportam lookarounds :
      • ^(([^f].{2}|.[^o].|.{2}[^o]).*|.{0,2})$
      • ^([^f].{2}|.[^o].|.{2}[^o])|^.{0,2}$
  • uma string terminando com um padrão específico (digamos, no world. no final):
    • Solução baseada em Lookbehind:
      • (?
      • ^.*(?
    • Solução alternativa 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})$
  • uma string contendo texto específico (digamos, não coincide com uma string tendo foo ) (não é compatível com POSIX, desculpe):
    • ^(?!.*foo)
    • ^(?!.*foo).*$
  • uma string contendo caractere específico (digamos, evite corresponder uma string com um símbolo | ):
    • ^[^|]*$
  • uma string igual a alguma string (digamos, diferente de foo ):
    • Baseado em Lookaround:
      • ^(?!foo$)
      • ^(?!foo$).*$
    • POSIX:
      • ^(.{0,2}|.{4,}|[^f]..|.[^o].|..[^o])$
  • uma seqüência de caracteres :
    • PCRE (corresponde a qualquer texto, exceto cat ): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i ou /cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
    • Outros mecanismos que permitem lookarounds: (cat)|[^c]*(?:c(?!at)[^c]*)* At (cat)|[^c]*(?:c(?!at)[^c]*)* (ou (?s)(cat)|(?:(?!cat).)* , ou (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]* ) e, em seguida, verifique com a linguagem significa: se o Grupo 1 foi correspondido, não é o que precisamos, senão, pegue o valor da correspondência, se não estiver vazio
  • um determinado caractere único ou um conjunto de caracteres :
    • Use uma class de caractere negada : [^az]+ (qualquer caractere diferente de uma letra ASCII minúscula)
    • Combinando qualquer char (s), mas | : [^|]+

Nota de demonstração : a nova linha \n é usada dentro de classs de caracteres negadas em demonstrações para evitar o estouro de correspondência para a (s) linha (s) vizinha (is). Eles não são necessários ao testar strings individuais.

Nota âncora : Em muitas linguagens, use \A para definir o começo inequívoco da string, e \z (em Python, é \Z , em JavaScript, $ é OK) para definir o final da string.

Nota : Em muitos sabores (mas não em POSIX, TRE, TCL) . corresponde a qualquer char, mas a um caractere de nova linha . Certifique-se de usar um modificador DOTALL correspondente ( /s em PCRE / Boost / .NET / Python / Java e /m em Ruby) para o . para corresponder a qualquer caractere, incluindo uma nova linha.

Nota de contrabarra : Em idiomas onde você tem que declarar padrões com strings C permitindo seqüências de escape (como \n para uma nova linha), você precisa dobrar as barras invertidas escapando caracteres especiais para que o mecanismo possa tratá-los como caracteres literais (por exemplo, em Java, world\. será declarado como "world\\." , ou use uma class de caracteres: "world[.]" ). Use literais de string raw (Python r'\bworld\b' ), literalmente string de C # r'\bworld\b' @"world\." , ou annotations literais strings / regex como /world\./ / /world\./ .

Em 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 combinar /^index\.php/ depois rejeitar o que for que corresponda.

grep -v em shell

! ~ em perl

Por favor, adicione mais em outros idiomas – marquei isso como Wiki da comunidade.

Que tal não usar regex:

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