Partilhar via


Referências Anteriores

Uma referência anterioir identifica a subsequência capturada por um grupo correspondente em uma expressão regular.Cada referência anterior é identificada por um número ou um nome, e é referenciada pela notação "\number" ou "\k<name>.Por exemplo, se a sequência de caracteres de entrada contiver várias ocorrências de uma subsequência arbitrária, você pode corresponder a primeira ocorrência com um grupo de captura, e então usar uma referência anterior para coincidir com ocorrências subsequentes da subsequência.Para obter mais informações, consulte Construtores de Referência Passada e Agrupando Construtores.

Referências anteriores fornecem uma maneira conveniente de localizar grupos de caracteres repetidos.Elas podem ser consideradas como uma instrução abreviada para corresponder à mesma sequência de caracteres novamente.Por exemplo, para localizar caracteres adjacentes repetidos, como os dois Ls na palavra "tall", você usaria a expressão regular (?<char>\w)\k<char>, que usa o metacaractere \w para localizar qualquer caractere de palavra única.A construção de agrupamento (?<char> ) inclui o metacaractere para forçar o mecanismo de expressões regulares a lembrar uma correspondência de subexpressão (que nesse caso será qualquer caractere único) e salvá-la com o nome "char".A construção de referência anterior \k<char> faz com que o mecanismo compare o caractere atual com o caractere anteriormente correspondido armazenado em "char".A expressão regular inteira encontra uma correspondência com êxito onde quer que um único caractere seja o mesmo que o caractere precedente.

Para localizar palavras inteiras repetidas, você pode modificar a subexpressão de agrupamento para procurar qualquer grupo de caracteres precedido por um espaço, em vez de simplesmente procurar qualquer caractere único.Você pode substituir a subexpressão \w+, que coincide com qualquer grupo de caracteres, pelo metacaractere \w e usar o metacaractere \s para corresponder a um espaço antes do grupo de caracteres.Isso produz a expressão regular (?<char>\s\w+)\k<char>, que localiza quaisquer palavras inteiras repetidas tais como "the the", mas também correponde a outras repetições da sequência de caracteres especificada, como na frase "the theory."

Para verificar se o segundo correspondente está em um limite de palavra, adicione o metacaractere \b após a correspondência de repetição.A expressão regular resultante, (?<char>\s\w+)\k<char>\b, localiza somente palavras inteiras repetidas que estiverem precedidas por espaço em branco.

Analisando referências anteriores

As expressões de \1 a \9 sempre se referem a referências anteriores, não a códigos octais.Expressões com mais de um dígito de \10 para cima são consideradas referências anteriores se houver uma referência anterior correspondente a esse número; caso contrário, elas são interpretadas como códigos octais (a menos que os dígitos iniciais sejam 8 ou 9, caso em que eles são tratados como "8" e "9" literais).Se uma expressão regular contém uma referêcia anterior para um número de grupo indefinido, ela será considerada um erro de análise.Se a ambiguidade for um problema, você pode usar a notação \k<n>, que é não ambíguo e não pode ser confundida com códigos de caracteres octal; da mesma forma, os códigos hexadecimais como \xdd são não ambíguos e não podem ser confundidos com referências anteriores.

O comportamento de referências anteriores é um pouco diferente quando o sinalizador de opção ECMAScript está ativado.Para obter mais informações, consulte ECMAScript vs. Canonical Matching Behavior.

Correspondência de referências anteriores

Uma referência anterior refere-se à definição mais recente de um grupo (a definição mais imediatamente à esquerda, quando a correspondência for da esquerda para a direita).Especificamente, quando um grupo faz várias captura, uma referência anterior refere-se à mais recente captura.Por exemplo, (?<1>a)(?<1>\1b)* corresponde aababb, com o padrão de captura (a)(ab)(abb).Quantificadores de loop não limpam definições de grupo.

Se um grupo não capturou nenhuma subsequência de caracteres, uma referência anterior a esse grupo é indefinida e nunca corresponde.Por exemplo, a expressão \1() nunca coincide com qualquer coisa, mas a expressão ()\1 coincide com a sequência de caracteres vazia.

Consulte também

Outros recursos

Expressões Regulares do .NET Framework