Regex lookahead, lookbehind e grupos atômicos

Eu encontrei essas coisas no meu corpo de regex, mas eu não tenho a menor idéia do que posso usá-las. Alguém tem exemplos para que eu possa tentar entender como eles funcionam?

(?!) - negative lookahead (?=) - positive lookahead (?<=) - positive lookbehind (?) - atomic group 

    Exemplos

    Dada a string foobarbarfoo :

     bar(?=bar) finds the 1st bar ("bar" which has "bar" after it) bar(?!bar) finds the 2nd bar ("bar" which does not have "bar" after it) (?< =foo)bar finds the 1st bar ("bar" which has "foo" before it) (? 

    Você também pode combiná-los:

     (?< =foo)bar(?=bar) finds the 1st bar ("bar" with "foo" before it and "bar" after it) 

    Definições

    Olhe para frente positivo (?=)

    Encontre a expressão A onde a expressão B segue:

     A(?=B) 

    Olhe para frente negativo (?!)

    Encontre a expressão A onde a expressão B não segue:

     A(?!B) 

    Olhe para trás positivo (?< =)

    Encontre a expressão A onde a expressão B precede:

     (?< =B)A 

    Olhe para trás negativo (?< !)

    Encontre a expressão A onde a expressão B não precede:

     (?< !B)A 

    Grupos atômicos (?>)

    Um grupo atômico é um grupo de não captura que sai do grupo e joga fora todas as alternativas após a primeira correspondência do padrão dentro do grupo, portanto, o retrocesso é desativado.

    Um grupo não atômico permitirá o retrocesso, ele ainda encontrará a primeira correspondência e, se a correspondência à frente falhar, voltará e encontrará a próxima correspondência, até que uma correspondência para a expressão inteira seja encontrada ou todas as possibilidades sejam esgotadas.

    • Um grupo não atômico na expressão (foo|foot)s aplicado a foots irá:

      1. coincidir com sua primeira alternativa foo , então falhar como s não segue imediatamente em foots e voltar para sua segunda alternativa;
      2. combine seu segundo foot alternativo, então suceda como s segue imediatamente em foots , e pare.
    • Um grupo atômico na expressão (?>foo|foot)s aplicado a foots corresponderá a sua 1ª alternativa foo , então falhará como s não segue imediatamente, e parará quando o retrocesso estiver desabilitado.

    Alguns resources

    Lookarounds são asserções de largura zero. Eles verificam um regex (para a direita ou para a esquerda da posição atual – com base na frente ou atrás), obtêm sucesso ou falha quando uma correspondência é encontrada (com base em se é positivo ou negativo) e descartam a parte correspondente. Eles não consomem nenhum caractere – a correspondência para o regex que os segue (se houver) começará na mesma posição do cursor.

    Leia regular-expression.info para mais detalhes.

    • Lookahead positivo:

    Sintaxe:

     (?=REGEX_1)REGEX_2 

    Corresponder apenas se REGEX_1 corresponder; depois de corresponder a REGEX_1, a correspondência é descartada e a pesquisa de REGEX_2 começa na mesma posição.

    exemplo:

     (?=[a-z0-9]{4}$)[az]{1,2}[0-9]{2,3} 

    REGEX_1 é [a-z0-9]{4}$ que corresponde a quatro caracteres alfanuméricos seguidos de final de linha.
    REGEX_2 é [az]{1,2}[0-9]{2,3} que corresponde a uma ou duas letras seguidas por dois ou três dígitos.

    REGEX_1 certifica-se de que o comprimento da cadeia é de fato 4, mas não consome nenhum caractere para que a pesquisa por REGEX_2 inicie no mesmo local. Agora REGEX_2 garante que a string corresponda a algumas outras regras. Sem olhar para frente, combinaria com strings de comprimento três ou cinco.

    • Lookahead negativo

    Sintaxe:

     (?!REGEX_1)REGEX_2 

    Corresponder apenas se REGEX_1 não corresponder; depois de verificar REGEX_1, a pesquisa por REGEX_2 começa na mesma posição.

    exemplo:

     (?!.*\bFWORD\b)\w{10,30}$ 

    A parte de look-ahead verifica o FWORD na string e falha se o encontrar. Se não encontrar FWORD , a FWORD bem-sucedida e a parte seguinte verificará se o tamanho da string está entre 10 e 30 e se contém apenas caracteres de palavra a-zA-Z0-9_

    Look-behind é semelhante ao look-ahead: ele apenas olha atrás da posição atual do cursor. Alguns sabores de regex, como o javascript, não oferecem suporte a asserções de aparência oculta. E a maioria dos sabores que o suportam (PHP, Python, etc.) requerem que a parte com aparência anterior tenha um tamanho fixo.

    • Grupos atômicos basicamente descartam / esquecem os tokens subseqüentes no grupo uma vez que um token coincida. Confira esta página para exemplos de grupos atômicos

    Grokking procura rapidamente.
    Como distinguir lookahead e lookbehind? Faça um tour de 2 minutos comigo:

     (?=) - positive lookahead (?< =) - positive lookbehind 

    Supor

      ABC #in a line 

    Agora, perguntamos B, cadê você?
    B tem duas soluções para declarar sua localização:

    Um, B tem A à frente e tem C bebind
    Dois, B está à frente (lookahead) de C e atrás (lookhehind) A.

    Como podemos ver, o lado de trás e o da frente são opostos nas duas soluções.
    Regex é a solução dois.