Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Referências anteriores fornecem uma maneira conveniente para identificar um repetidas de caracteres ou subseqüência de caracteres dentro de uma seqüência. Por exemplo, a seqüência de caracteres de entrada contém várias ocorrências de uma subseqüência de caracteres arbitrária, você pode coincidir com a primeira ocorrência com um grupo de captura e, em seguida, use uma retrorreferência para corresponder às ocorrências subseqüentes da subseqüência.
Observação
Uma sintaxe separada é usada para se referir a numeradas de captura de grupos de seqüências de caracteres de substituição e nomeado.Para obter mais informações, consulte Substituições.
A.NET Framework define elementos de idioma separados para se referir a grupos de captura numerados e nomeados. Para obter mais informações sobre a captura de grupos, consulte Agrupando Construtores.
Referências anteriores numeradas
Referência numerada anterior usa a seguinte sintaxe:
\número
onde número é a posição ordinal de um grupo de captura na expressão regular. Por exemplo, \4 coincide com o conteúdo do quarto captura grupo. Se número não é definido no padrão de expressão regular, ocorre de um erro de análise e o mecanismo de expressão regular lança um ArgumentException. Por exemplo, a expressão regular \b(\w+)\s\1 é válido, pois (\w+) é o primeiro e capturando somente o grupo na expressão. Por outro lado, \b(\w+)\s\2 é inválido e lança uma exceção de argumento, porque não há nenhum grupo de captura numerado \2.
Observe a ambigüidade entre os códigos de escape octais (como \16) e \número referências anteriores que usam a notação do mesma. Essa ambigüidade é resolvida da seguinte maneira:
As expressões \1 por \9 são sempre interpretados como referências anteriores e não como códigos octal.
Se o primeiro dígito de uma expressão de diversos dígitos é 8 ou 9 (como \80 ou \91), a expressão conforme interpretado como um literal.
Expressões de \10 e maior são consideradas referências anteriores, se houver uma retrorreferência correspondente a esse número; Caso contrário, eles são interpretados como códigos octais.
Se uma expressão regular contiver uma referência anterior a um número indefinido de grupo, ocorre um erro de análise e o mecanismo de expressão regular lança um ArgumentException.
Se a ambigüidade é um problema, você pode usar o \k<nome> notação, o que é inequívoca e não pode ser confundidas com códigos de caracteres octal. Da mesma forma, hexadecimal códigos, como \xdd não são ambíguas e não pode ser confundida com referências anteriores.
O exemplo a seguir localiza palavras repetidas de caracteres em uma seqüência de caracteres. Ele define uma expressão regular, (\w)\1, que consiste o elementos a seguir.
Elemento |
Descrição |
|---|---|
(\w) |
Corresponde a um caractere de palavra e atribuí-lo ao primeiro grupo de captura. |
\1 |
Coincide com o próximo caractere que é o mesmo que o valor do primeiro grupo de capturando. |
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "(\w)\1"
Dim input As String = "trellis llama webbing dresser swagger"
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine("Found '{0}' at position {1}.", _
match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Found 'll' at position 3.
' Found 'll' at position 8.
' Found 'bb' at position 16.
' Found 'ss' at position 25.
' Found 'gg' at position 33.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(\w)\1";
string input = "trellis llama webbing dresser swagger";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine("Found '{0}' at position {1}.",
match.Value, match.Index);
}
}
// The example displays the following output:
// Found 'll' at position 3.
// Found 'll' at position 8.
// Found 'bb' at position 16.
// Found 'ss' at position 25.
// Found 'gg' at position 33.
Referências anteriores de nomeado
Uma retrorreferência nomeada é definida usando a seguinte sintaxe:
\k<name>
Ou:
\k'name'
onde nome é o nome de um grupo de captura definido no padrão de expressão regular. Se nome não é definido no padrão de expressão regular, ocorre de um erro de análise e o mecanismo de expressão regular lança um ArgumentException.
O exemplo a seguir localiza palavras repetidas de caracteres em uma seqüência de caracteres. Ele define uma expressão regular, (?<char>\w)\k<char>, que consiste o elementos a seguir.
Elemento |
Descrição |
|---|---|
(?<char>\w) |
Corresponde a um caractere de palavra e atribuí-la a um grupo de captura chamado char. |
\k<char> |
Coincidir com o próximo caractere que é o mesmo que o valor da char captura de grupo. |
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "(?<char>\w)\k<char>"
Dim input As String = "trellis llama webbing dresser swagger"
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine("Found '{0}' at position {1}.", _
match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Found 'll' at position 3.
' Found 'll' at position 8.
' Found 'bb' at position 16.
' Found 'ss' at position 25.
' Found 'gg' at position 33.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(?<char>\w)\k<char>";
string input = "trellis llama webbing dresser swagger";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine("Found '{0}' at position {1}.",
match.Value, match.Index);
}
}
// The example displays the following output:
// Found 'll' at position 3.
// Found 'll' at position 8.
// Found 'bb' at position 16.
// Found 'ss' at position 25.
// Found 'gg' at position 33.
Observe que nome também pode ser a representação de seqüência de caracteres de um número. Por exemplo, o exemplo a seguir usa a expressão regular (?<2>\w)\k<2> Localizar dobrou caracteres de palavra em uma seqüência de caracteres.
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "(?<2>\w)\k<2>"
Dim input As String = "trellis llama webbing dresser swagger"
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine("Found '{0}' at position {1}.", _
match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Found 'll' at position 3.
' Found 'll' at position 8.
' Found 'bb' at position 16.
' Found 'ss' at position 25.
' Found 'gg' at position 33.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(?<2>\w)\k<2>";
string input = "trellis llama webbing dresser swagger";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine("Found '{0}' at position {1}.",
match.Value, match.Index);
}
}
// The example displays the following output:
// Found 'll' at position 3.
// Found 'll' at position 8.
// Found 'bb' at position 16.
// Found 'ss' at position 25.
// Found 'gg' at position 33.
Correspondência que 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). Quando faz um grupo que várias capturas, uma retrorreferência refere-se à captura mais recente.
O exemplo a seguir inclui um padrão de expressão regular, (?<1>a)(?<1>\1b)*, que redefine o \ 1 chamado grupo. A tabela a seguir descreve cada padrão de expressão regular.
Padrão |
Descrição |
|---|---|
(?<1>a) |
Corresponder ao caractere "a" e atribui o resultado para o grupo de capturando chamado 1. |
(?<1>\1b)* |
Ocorrência de correspondência de 0 ou 1 do grupo chamado 1 juntamente com um "b" e atribuir o resultado para o grupo de captura chamado 1. |
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "(?<1>a)(?<1>\1b)*"
Dim input As String = "aababb"
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine("Match: " + match.Value)
For Each group As Group In match.Groups
Console.WriteLIne(" Group: " + group.Value)
Next
Next
End Sub
End Module
' The example display the following output:
' Group: aababb
' Group: abb
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(?<1>a)(?<1>\1b)*";
string input = "aababb";
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine("Match: " + match.Value);
foreach (Group group in match.Groups)
Console.WriteLine(" Group: " + group.Value);
}
}
}
// The example displays the following output:
// Group: aababb
// Group: abb
Em comparação a expressão regular com a seqüência de caracteres de entrada ("aababb"), o mecanismo de expressão regular realiza as seguintes operações:
Ele começa no início da seqüência de caracteres e corresponde com êxito "a" com a expressão (?<1>a). O valor de 1 grupo é agora "a".
Ele avança para o segundo caractere e corresponde a seqüência de caracteres "ab" com êxito com a expressão \1b, ou "ab". Em seguida, atribui o resultado "ab" to \1.
Ele avança para o quarto caractere. A expressão (?<1>\1b) está a ser correspondido zero ou mais vezes, portanto, com êxito corresponda a seqüência de caracteres "abb" com a expressão \1b. Ele atribui o resultado, "abb" Voltar ao \1.
Neste exemplo, * é um quantificador loop – ele é avaliado repetidamente até que o mecanismo de expressão regular não pode corresponder a ele define o padrão de. Quantificadores de loop não limpam definições de grupo.
Se um grupo não capturou a qualquer uma das subseqüências, uma referência anterior a esse grupo está indefinido e nunca corresponde. Isso é ilustrado pelo padrão de expressão regular \b(\p{Lu}{2})(\d{2})?(\p{Lu}{2})\b, que é definido da seguinte maneira:
Padrão |
Descrição |
|---|---|
\b |
Começa a correspondência de um limite de palavra. |
(\p{Lu}{2}) |
Coincide com duas letras maiúsculas. Este é o primeiro grupo de capturando. |
(\d{2})? |
Corresponde à ocorrência de zero ou um de dois dígitos decimais. Este é o segundo grupo de capturando. |
(\p{Lu}{2}) |
Coincide com duas letras maiúsculas. Este é o terceiro grupo de capturando. |
\b |
Finalize a correspondência de um limite de palavra. |
Uma seqüência de caracteres de entrada pode corresponder a essa expressão regular, mesmo se os dois dígitos decimais que são definidos pelo segundo grupo de capturando não estão presentes. O exemplo a seguir mostra que, mesmo que a correspondência for bem-sucedida, um grupo de capturando vazio é encontrado entre dois grupos de capturando com êxito.
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(\p{Lu}{2})(\d{2})?(\p{Lu}{2})\b"
Dim inputs() As String = { "AA22ZZ", "AABB" }
For Each input As String In inputs
Dim match As Match = Regex.Match(input, pattern)
If match.Success Then
Console.WriteLine("Match in {0}: {1}", input, match.Value)
If match.Groups.Count > 1 Then
For ctr As Integer = 1 To match.Groups.Count - 1
If match.Groups(ctr).Success Then
Console.WriteLine("Group {0}: {1}", _
ctr, match.Groups(ctr).Value)
Else
Console.WriteLine("Group {0}: <no match>", ctr)
End If
Next
End If
End If
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' Match in AA22ZZ: AA22ZZ
' Group 1: AA
' Group 2: 22
' Group 3: ZZ
'
' Match in AABB: AABB
' Group 1: AA
' Group 2: <no match>
' Group 3: BB
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(\p{Lu}{2})(\d{2})?(\p{Lu}{2})\b";
string[] inputs = { "AA22ZZ", "AABB" };
foreach (string input in inputs)
{
Match match = Regex.Match(input, pattern);
if (match.Success)
{
Console.WriteLine("Match in {0}: {1}", input, match.Value);
if (match.Groups.Count > 1)
{
for (int ctr = 1; ctr <= match.Groups.Count - 1; ctr++)
{
if (match.Groups[ctr].Success)
Console.WriteLine("Group {0}: {1}",
ctr, match.Groups[ctr].Value);
else
Console.WriteLine("Group {0}: <no match>", ctr);
}
}
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// Match in AA22ZZ: AA22ZZ
// Group 1: AA
// Group 2: 22
// Group 3: ZZ
//
// Match in AABB: AABB
// Group 1: AA
// Group 2: <no match>
// Group 3: BB