Partilhar via


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>>"

*/

Consulte também

Outros recursos

Elementos de linguagem das expressões regulares