Expressão regular que não contém determinada string

Eu tenho algo parecido com isto

aabbabcaabda

para selecionar o grupo mínimo envolvido por um eu tenho este /a([^a]*)a/ que funciona muito bem

Mas eu tenho problema com grupos envoltos por aa , onde eu preciso de algo como /aa([^aa]*)aa/ que não funciona, e eu não posso usar o primeiro como /aa([^a]*)aa/ , porque terminaria na primeira ocorrência de a , o que eu não quero.

Geralmente, existe alguma maneira, como dizer não contém string da mesma forma que eu posso dizer não contém caracteres com [^a] ?

Simplesmente disse, eu preciso aa seguido por qualquer caractere, exceto seqüência aa e, em seguida, termina com aa

Em geral, é difícil escrever uma expressão regular que não contenha uma string específica. Nós tínhamos que fazer isso para modelos de computação – você pega um NFA, que é fácil de definir, e depois o reduz a uma expressão regular. A expressão para coisas que não continham “gato” tinha cerca de 80 caracteres.

Edit: Acabei de terminar e sim, é:

 aa([^a] | a[^a])aa 

Aqui está um tutorial muito breve. Eu encontrei alguns ótimos antes, mas não posso mais vê-los.

Pelo poder do Google, encontrei um post de blog de 2007 que fornece o seguinte regex que corresponde a string que não contém uma certa substring:

 ^((?!my string).)*$ 

Funciona da seguinte maneira: procura por zero ou mais (*) caracteres (.) Que não começam (?! – lookahead negativo) sua string e estipula que a string inteira deve ser composta de tais caracteres (usando o ^ e $ âncoras). Ou, de outra forma:

A string inteira deve ser composta de caracteres que não iniciam uma determinada string, o que significa que a string não contém a substring especificada.

Tudo o que você precisa é de um quantificador relutante:

 regex: /aa.*?aa/ aabbabcaabda => aabbabcaa aaaaaabda => aaaa aabbabcaabda => aabbabcaa aababaaaabdaa => aababaa, aabdaa 

Você também pode usar lookahead negativo, mas nesse caso é apenas uma maneira mais detalhada de realizar a mesma coisa. Além disso, é um pouco mais complicado do que o gpojd fez. O lookahead deve ser aplicado em cada posição antes que o ponto consuma o próximo caractere.

 /aa(?:(?!aa).)*aa/ 

Quanto à abordagem sugerida por Claudiu e Finnw, tudo funcionará bem quando a string sentinela tiver apenas dois caracteres, mas (como Claudiu reconheceu) é muito difícil de usar para seqüências mais longas.

 /aa([^a]|a[^a])*aa/ 

Não tenho certeza se é uma construção padrão, mas acho que você deveria dar uma olhada em “lookahead negativo” (que escreve: “?!”, Sem as aspas). É muito mais fácil do que todas as respostas neste tópico, incluindo o aceito.

Exemplo: Regex: “^ (?! 123) [0-9] * \ w” Captura qualquer cadeia iniciada por dígitos seguida por letras, A MENOS se “estes dígitos” forem 123.

http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs (página da Microsoft, mas bastante abrangente) para lookahead / lookbehind

PS: funciona bem para mim (.net). Mas se eu estiver errado em alguma coisa, por favor nos avise. Acho esse constructo muito simples e eficaz, por isso estou surpreso com a resposta aceita.

Eu o seguinte código que eu tive que replace adicionar um parâmetro GET para todas as referências a arquivos JS, exceto um.

     sendRequest('/application/srvc/EXCEPTION.js', handleChallengeResponse, null); sendRequest('/application/srvc/EXCEPTION.js",handleChallengeResponse, null); 

Este é o Matcher usado:

 (? 

O que isso faz é procurar todas as ocorrências de ".js" e, se forem precedidas pela cadeia "EXCEPTION", descartar esse resultado da matriz resultante. Isso é chamado lookbehind negativo. Desde que passei um dia descobrindo como fazer isso, pensei que deveria compartilhar.

 ".*[^(\\.inc)]\\.ftl$" 

Em Java, isso encontrará todos os arquivos terminados em “.ftl”, mas não terminando em “.inc.ftl”, que é exatamente o que eu queria.

    Intereting Posts