Поделиться через


Конструкции группирования

Обновлен: Ноябрь 2007

Конструкции группирования отображают часть выражения регулярных выражений и обычно выделяют часть строки входной строки. В следующей таблице описаны конструкции группирования регулярных выражений.

Конструкция группирования

Описание

(часть выражения)

Выделяет соответствующую часть выражения (или невыделяемую группу; дополнительные сведения см. в описании параметра ExplicitCapture раздела Параметры регулярных выражений). Выделяемые области, использующие (), нумеруются автоматически по порядку открывающей скобки, начиная с 1. Первый элемент, элемент номер 0, — это текст, соответствующий всему регулярному выражению.

(?<имя>часть выражения)

Выделяет соответствующую часть выражения в имени группы или в имени номера. Строка, используемая для компонента имя, не должна содержать знаков пунктуации и не может начинаться с цифры. Вместо угловых скобок можно использовать одинарные кавычки, например, (?'name').

(?<имя1-имя2>часть выражения)

Сбалансированное определение группы. Удаляет определение ранее определенной группы имя2 и сохраняет в группе имя1 интервал между ранее определенной группой имя2 и текущей группой. Если группа имя2 не определена, то сопоставление возвращается. Поскольку после удаления последнего определения имя2 открывается предыдущее определение имя2, то эта конструкция позволяет использовать набор выделяемый областей для группы имя2 как счетчик для отслеживания вложенных конструкций, таких как скобки. В этой конструкции имя1 — необязательно. Вместо угловых скобок можно использовать одинарные кавычки, например, (?'name1-name2').

Дополнительные сведения см. в примере этого раздела.

(?:часть выражения)

(Невыделяемая группа). Не выделяет часть строки, соответствующую части выражения.

(?imnsx-imnsx:часть выражения)

Использует или отключает заданные параметры внутри части выражения. Например, (?i-s: ) включает учет регистра и делает невозможным однострочный режим. Дополнительные сведения см. в разделе Параметры регулярных выражений.

(?=часть выражения)

(Положительное утверждение просмотра вперед нулевой ширины). Продолжает сопоставление, при условии, что часть выражения совпадает справа от этой позиции. Например, \w+(?=\d) соответствует слову, за которым следует цифра, но не соответствует цифре. Эта конструкция не возвращается.

(?!часть выражения)

(Отрицательное утверждение просмотра вперед нулевой ширины). Продолжает сопоставление, только если часть выражения не соответствует справа от этой позиции. Например, \b(?!un)\w+\b соответствует слову, которое не начинается с un.

(?<=часть выражения)

(Положительное утверждение просмотра назад нулевой ширины). Продолжает сопоставление, только если часть выражения соответствует слева от этой позиции. Например, (?<=19)99 соответствует всем сочетаниям "99", следующим за "19". Эта конструкция не возвращается.

(?<!часть выражения)

(Отрицательное утверждение просмотра назад нулевой ширины). Продолжает сопоставление, только если часть выражения не соответствует слева от этой позиции.

(?>часть выражения)

(Невозвращающая часть выражения (также известное как "жадная" часть выражения)). После того как часть выражения полностью совпала один раз, она не участвует в возвращении по частям. (то есть, часть выражения соответствует только тем строкам, которые сопоставились бы только с одной этой частью выражения).

По умолчанию, если соответствие не найдено, то для возвращения будут найдены другие возможные совпадения. Если известно, что возвращение нельзя осуществить, то можно использовать невозвращающую часть выражения для предотвращения ненужного поиска, что повышает производительность.

Именованные выделяемые области нумеруются последовательно по порядку открывающих скобок слева направо (как неименованные выделяемые области), но нумерация именованных областей начинается после нумерации неименованных. Например, шаблон ((?<One>abc)\d+)?(?<Two>xyz)(.*) создает следующие выделяемые группы по номеру и имени. (первая выделяемая область (номер 0) всегда ссылается на весь шаблон).

Номер

Имя

Шаблон

0

0 (имя по умолчанию)

((?<One>abc)\d+)?(?<Two>xyz)(.*)

1

1 (имя по умолчанию)

((?<One>abc)\d+)

2

2 (имя по умолчанию)

(.*)

3

Один

(?<One>abc)

4

Два

(?<Two>xyz)

Пример использования сбалансированного определения группы

В следующем примере показано использование сбалансированного определения группы, выделяющего левые и правые угловые скобки (<>) во входной строке. Коллекции выделенных областей групп Open и Close в примере используются как стек для отслеживания соответствующих пар угловых скобок: каждая левая угловая скобка выделяемой области помещается в коллекцию выделяемых областей группы Open; каждая правая угловая скобка выделяемой области помещается в коллекцию выделяемой области группы Close; а сбалансированное определение группы следит, чтобы каждой левой угловой скобки соответствовала правая угловая скобка.

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

*/

См. также

Другие ресурсы

Элементы языка регулярных выражений