Agrupando Construtores
Agrupamento de construtores delinam subexpressões de uma expressão regular e tipicamente capta subsequências de caracteres de uma sequência de caracteres de entrada.A tabela a seguir descreve a expressão regular agrupando construtores
Agrupando Construtores |
Descrição |
---|---|
(Subexpressão) |
Captura a subexpressão correspondente (ou o grupo não capturado; para obter mais informações, consulte a opção Captura Explícita em Opções de Expressão Regular).Capturas utilizando () são numeradas automaticamente com base na ordem dos parênteses de abertura, a partir de um.A primeira captura, elemento de captura número zero, é o texto correspondente a todo o padrão de expressão regular. |
(?<name>subexpression) |
Captura a subexpressão correspondente em um nome de grupo ou nome de número.A sequência de caracteres usada para nome não deve conter qualquer pontuação e não pode começar com um número.Você pode usar aspas simples em vez de colchetes angulares; por exemplo, (?'name'). |
(?<name1-name2>subexpression) |
(Equilibrando a definição de grupo.) Exclui a definição dos grupos definidos anteriormente nome2 e armazena no grupo nome1 o intervalo entre o grupo previamente definido nome2 e o grupo atual.Se nenhum grupo nome2 for definido, a correspondência volta atrás.Pelo fato da exclusão da última definição denome2 revelar a definição anterior de nome2, esta construção permite que a pilha de capturas para o gruponome2 seja utilizado como contador para guardar a trilha de construtores aninhados, tais como parênteses.Nesta construção, nome1 é opcional.Você pode usar aspas simples em vez de colchetes angulares; por exemplo, (?'name1-name2'). Para obter mais informações, consulte o exemplo contido neste tópico. |
(?:Subexpressão) |
(Grupo sem-captura). Não captura a subsequência correspondida pela subexpressão. |
(?imnsx-imnsx:Subexpressão) |
Aplica ou desativa as opções especificadas dentro da subexpressão.Por exemplo, (?i-s: ) ativa a não distinção entre maiúsculas e minúsculas e desativa o modo linha-única.Para obter mais informações, consulte Opções de Expressões Regulares. |
(?=Subexpressão) |
(Asserção de antecipação positiva de tamanho zero) Continua a correspondência apenas se a subexpressão corresponder, nessa posição, no lado direito.Por exemplo, \w+(?=\d) corresponde uma palavra seguida por um dígito, sem correspondência de dígito.Este construtor não volta atrás. |
(?!Subexpressão) |
(Asserção de antecipação negativa de tamanho zero) Continua a correspondência apenas se a subexpressão não corresponder, nessa posição, no lado direito.Por exemplo, \b(?!un)\w+\b encontra as palavras que não começam com un. |
(?<=Subexpressão) |
(Asserção de recuo positivo de tamanho zero.) Continua a correspondência apenas se a subexpressão corresponder, nessa posição, no lado esquerdo.Por exemplo, (?<=19)99 coincide com ocorrências de 99 siga 19. Este construtor não volta atrás. |
(?<!Subexpressão) |
(Asserção de recuo negativo de tamanho zero.) Continua a correspondência apenas se a subexpressão não corresponder, nessa posição, no lado esquerdo. |
(?>Subexpressão) |
(Subexpressão que não realizam recuo (também conhecida com subexpressão gulosa.)) A subexpressão é totalmente correspondida uma vez, e em seguida, não participa do retrocesso.(Ou seja, a subexpressão corresponde apenas a sequências de caracteres que poderiam ser correspondidas pela subexpressão sozinha.) Por padrão, se uma correspondência não tiver êxito, o retrocesso procura por outras possíveis correspondências.Se você souber que o retrocesso não obterá êxito, você poderá usar uma subexpressão sem-retrocesso para evitar pesquisas desnecessárias, o que melhora o desempenho. |
Capturas nomeadas são numeradas sequencialmente, com base na ordem da esquerda para a direita do parêntese de abertura (como captura sem-nome), mas a numeração de capturas nomeadas inicia após todas as capturas sem-nome terem sido contadas.Por exemplo, o padrão ((?<One>abc)\d+)?(?<Two>xyz)(.*) produz os seguintes grupos de captura por número e nome.(A primeira captura (número 0) sempre faz referência ao padrão inteiro).
Número |
Nome |
Padrão |
---|---|---|
0 |
0 (Nome padrão) |
((?<One>abc)\d+)?(?<Two>xyz)(.*) |
1 |
1 (Nome padrão) |
((?<One>abc)\d+) |
2 |
2 (Nome padrão) |
(.*) |
3 |
Um |
(?<One>abc) |
4 |
Dois |
(?<Two>xyz) |
Exemplo de Definição de Grupo de Balanceamento
O exemplo de código a seguir demonstra o uso do balanceamento de definição de grupo para correspondência de colchetes angulares de lado esquerdo e direito (<>) em uma sequência de caracteres de entrada.As coleções de capturar dos grupos de em em aberto e fechar o exemplo são usadas como uma pilha para controlar pares correspondentes de colchetes angulares: cada colchete angular esquerdo capturado está empurrado para a coleção de capturar do agrupar em em aberto; cada colchete angular direito capturados está empurrado para a coleção de capturar do agrupar fechar; e a definição de agrupar balanceamento garante que haja um colchete angular direito correspondente para cada colchete angular esquerdo.
' This code example demonstrates using the balancing group definition feature of
' regular expressions to match balanced left angle bracket (<) and right angle
' bracket (>) characters in a string.
Imports System
Imports System.Text.RegularExpressions
Class Sample
Public Shared Sub Main()
'
' The following expression matches all balanced left and right angle brackets(<>).
' The expression:
' 1) Matches and discards zero or more non-angle bracket characters.
' 2) Matches zero or more of:
' 2a) One or more of:
' 2a1) A group named "Open" that matches a left angle bracket, followed by zero
' or more non-angle bracket characters.
' "Open" essentially counts the number of left angle brackets.
' 2b) One or more of:
' 2b1) A balancing group named "Close" that matches a right angle bracket,
' followed by zero or more non-angle bracket characters.
' "Close" essentially counts the number of right angle brackets.
' 3) If the "Open" group contains an unaccounted for left angle bracket, the
' entire regular expression fails.
'
Dim pattern As String = "^[^<>]*" & _
"(" + "((?'Open'<)[^<>]*)+" & _
"((?'Close-Open'>)[^<>]*)+" + ")*" & _
"(?(Open)(?!))$"
Dim input As String = "<abc><mno<xyz>>"
'
Dim m As Match = Regex.Match(input, pattern)
If m.Success = True Then
Console.WriteLine("Input: ""{0}"" " & vbCrLf & "Match: ""{1}""", _
input, m)
Else
Console.WriteLine("Match failed.")
End If
End Sub 'Main
End Class 'Sample
'This code example produces the following results:
'
'Input: "<abc><mno<xyz>>"
'Match: "<abc><mno<xyz>>"
'
// This code example demonstrates using the balancing group definition feature of
// regular expressions to match balanced left angle bracket (<) and right angle
// bracket (>) characters in a string.
using System;
using System.Text.RegularExpressions;
class Sample
{
public static void Main()
{
/*
The following expression matches all balanced left and right angle brackets(<>).
The expression:
1) Matches and discards zero or more non-angle bracket characters.
2) Matches zero or more of:
2a) One or more of:
2a1) A group named "Open" that matches a left angle bracket, followed by zero
or more non-angle bracket characters.
"Open" essentially counts the number of left angle brackets.
2b) One or more of:
2b1) A balancing group named "Close" that matches a right angle bracket,
followed by zero or more non-angle bracket characters.
"Close" essentially counts the number of right angle brackets.
3) If the "Open" group contains an unaccounted for left angle bracket, the
entire regular expression fails.
*/
string pattern = "^[^<>]*" +
"(" +
"((?'Open'<)[^<>]*)+" +
"((?'Close-Open'>)[^<>]*)+" +
")*" +
"(?(Open)(?!))$";
string input = "<abc><mno<xyz>>";
//
Match m = Regex.Match(input, pattern);
if (m.Success == true)
Console.WriteLine("Input: \"{0}\" \nMatch: \"{1}\"", input, m);
else
Console.WriteLine("Match failed.");
}
}
/*
This code example produces the following results:
Input: "<abc><mno<xyz>>"
Match: "<abc><mno<xyz>>"
*/