Классы регулярных выражений
Обновлен: Ноябрь 2007
В следующих разделах приводится описание классов регулярных выражений .NET Framework.
Класс Regex
Класс Regex представляет неизменяемое (только для чтения) регулярное выражение. В нем также содержатся статические методы, которые позволяют использовать другие классы регулярных выражений без явного создания экземпляров других классов.
В следующем примере кода создается экземпляр класса Regex и определяется простое регулярное выражение при инициализации объекта. Обратите внимание на необходимость использования дополнительной обратной косой черты в качестве escape-знака, который обозначает, что обратная косая черта в группе \s должна обрабатываться как знак.
' Declare object variable of type Regex.
Dim r As Regex
' Create a Regex object and define its regular expression.
r = New Regex("\s2000")
// Declare object variable of type Regex.
Regex r;
// Create a Regex object and define its regular expression.
r = new Regex("\\s2000");
Класс Match
Класс Match представляет результаты операций сопоставления регулярных выражений. В следующем примере метод Match класса Regex возвращает объект типа Match после нахождения первого соответствия во входной строке. В примере используется свойство Match.Success класса Match, чтобы указать, было ли обнаружено соответствие.
' Create a new Regex object.
Dim r As New Regex("abc")
' Find a single match in the input string.
Dim m As Match = r.Match("123abc456")
If m.Success Then
' Print out the character position where a match was found.
Console.WriteLine("Found match at position " & m.Index.ToString())
End If
' The example displays the following output:
' Found match at position 3
// Create a new Regex object.
Regex r = new Regex("abc");
// Find a single match in the string.
Match m = r.Match("123abc456");
if (m.Success)
{
// Print out the character position where a match was found.
Console.WriteLine("Found match at position " + m.Index);
}
// The example displays the following output:
// Found match at position 3
Класс MatchCollection
Класс MatchCollection представляет последовательность успешных непересекающихся соответствий. Данная коллекция является неизменной (только для чтения) и не имеет открытого конструктора. Экземпляры MatchCollection возвращаются методом Regex.Matches.
В следующем примере используется метод Matches класса Regex для заполнения MatchCollection всеми соответствиями во входной строке. В данном примере коллекция копируется в массив строк, каждая из которых содержит соответствие, и в массив целых чисел, указывающий расположение каждого соответствия.
Dim mc As MatchCollection
Dim results As New List(Of String)
Dim matchposition As New List(Of Integer)
' Create a new Regex object and define the regular expression.
Dim r As New Regex("abc")
' Use the Matches method to find all matches in the input string.
mc = r.Matches("123abc4abcd")
' Loop through the match collection to retrieve all
' matches and positions.
For i As Integer = 0 To mc.Count - 1
' Add the match string to the string array.
results.Add(mc(i).Value)
' Record the character position where the match was found.
matchposition.Add(mc(i).Index)
Next i
' List the results.
For ctr As Integer = 0 To Results.Count - 1
Console.WriteLine("'{0}' found at position {1}.", _
results(ctr), matchposition(ctr))
Next
' The example displays the following output:
' 'abc' found at position 3.
' 'abc' found at position 7.
MatchCollection mc;
List<string> results = new List<string>();
List<int> matchposition = new List<int>();
// Create a new Regex object and define the regular expression.
Regex r = new Regex("abc");
// Use the Matches method to find all matches in the input string.
mc = r.Matches("123abc4abcd");
// Loop through the match collection to retrieve all
// matches and positions.
for (int i = 0; i < mc.Count; i++)
{
// Add the match string to the string array.
results.Add(mc[i].Value);
// Record the character position where the match was found.
matchposition.Add(mc[i].Index);
}
// List the results.
for(int ctr = 0; ctr <= results.Count - 1; ctr++)
Console.WriteLine("'{0}' found at position {1}.", results[ctr], matchposition[ctr]);
// The example displays the following output:
// 'abc' found at position 3.
// 'abc' found at position 7.
Класс GroupCollection
Класс GroupCollection представляет коллекцию зарегистрированных групп и возвращает набор таких групп в отдельное сопоставление. Данная коллекция является неизменной (только для чтения) и не имеет открытого конструктора. Экземпляры GroupCollection возвращаются в коллекцию, которую возвращает свойство Match.Groups.
В следующем примере находится и печатается число групп, выделенных регулярным выражением. Способ извлечения отдельного члена из найденных соответствий в коллекции группы смотрите в примере Capture Collection следующего раздела.
' Define groups "abc", "ab", and "b".
Dim r As New Regex("(a(b))c")
Dim m As Match = r.Match("abdabc")
Console.WriteLine("Number of groups found = " _
& m.Groups.Count)
' The example displays the following output:
' Number of groups found = 3
// Define groups "abc", "ab", and "b".
Regex r = new Regex("(a(b))c");
Match m = r.Match("abdabc");
Console.WriteLine("Number of groups found = " + m.Groups.Count);
// The example displays the following output:
// Number of groups found = 3
Класс СaptureCollection
Класс CaptureCollection представляет последовательность выделенных подстрок и возвращает их набор, сделанный отдельной выделяющей группой. Выделяющая группа может выделять более одной строки в отдельном сопоставлении, благодаря кванторам. Свойство Captures, объект класса CaptureCollection, предоставляется как член классов Match и Group, чтобы облегчить доступ к набору выделенных подстрок.
Например, если используется регулярное выражение ((a(b))c)+ (где квантор + задает одно или несколько соответствий) для поиска соответствий в строке "abcabcabc", то CaptureCollection для каждой соответствующей Group подстрок будет содержать по три члена.
В следующем примере регулярное выражение (Abc)+ используется для поиска одного или нескольких соответствий в строке "XYZAbcAbcAbcXYZAbcAb". В данном примере показано применение свойства Captures для возврата нескольких групп выделенных подстрок.
Dim counter As Integer
Dim m As Match
Dim cc As CaptureCollection
Dim gc As GroupCollection
' Look for groupings of "Abc".
Dim r As New Regex("(Abc)+")
' Define the string to search.
m = r.Match("XYZAbcAbcAbcXYZAbcAb")
gc = m.Groups
' Display the number of groups.
Console.WriteLine("Captured groups = " & gc.Count.ToString())
' Loop through each group.
Dim i, ii As Integer
For i = 0 To gc.Count - 1
cc = gc(i).Captures
counter = cc.Count
' Display the number of captures in this group.
Console.WriteLine("Captures count = " & counter.ToString())
' Loop through each capture in the group.
For ii = 0 To counter - 1
' Display the capture and its position.
Console.WriteLine(cc(ii).ToString() _
& " Starts at character " & cc(ii).Index.ToString())
Next ii
Next i
' The example displays the following output:
' Captured groups = 2
' Captures count = 1
' AbcAbcAbc Starts at character 3
' Captures count = 3
' Abc Starts at character 3
' Abc Starts at character 6
' Abc Starts at character 9
int counter;
Match m;
CaptureCollection cc;
GroupCollection gc;
// Look for groupings of "Abc".
Regex r = new Regex("(Abc)+");
// Define the string to search.
m = r.Match("XYZAbcAbcAbcXYZAbcAb");
gc = m.Groups;
// Display the number of groups.
Console.WriteLine("Captured groups = " + gc.Count.ToString());
// Loop through each group.
for (int i=0; i < gc.Count; i++)
{
cc = gc[i].Captures;
counter = cc.Count;
// Display the number of captures in this group.
Console.WriteLine("Captures count = " + counter.ToString());
// Loop through each capture in the group.
for (int ii = 0; ii < counter; ii++)
{
// Display the capture and its position.
Console.WriteLine(cc[ii] + " Starts at character " +
cc[ii].Index);
}
}
}
// The example displays the following output:
// Captured groups = 2
// Captures count = 1
// AbcAbcAbc Starts at character 3
// Captures count = 3
// Abc Starts at character 3
// Abc Starts at character 6
// Abc Starts at character 9
Group
Класс Group предоставляет результаты из отдельной выделяющей группы. Поскольку Group может выделять нулевую, одну или несколько строк в каждом соответствии (используя кванторы), в нем содержится коллекция объектов Capture. Поскольку Group наследуется от Capture, к последней найденной подстроке возможно прямое обращение (сам экземпляр Group эквивалентен последнему элементу коллекции, возвращенному свойством Captures).
Экземпляры Group возвращаются с помощью индексирования объекта GroupCollection, возвращаемого свойством Groups. Индексатор может быть номером группы или именем выделяющей группы, если используется конструкция группировки "(?<groupname>)". Например, в коде C# можно использовать Match.Groups[groupnum] или Match.Groups["groupname"], или в коде Visual Basicможно использовать Match.Groups(groupnum) или Match.Groups("groupname").
В следующем примере кода используются вложенные конструкции групп для выделения подстрок в группы.
Dim matchposition As New List(Of Integer)
Dim results As New List(Of String)
' Define substrings abc, ab, b.
Dim r As New Regex("(a(b))c")
Dim m As Match = r.Match("abdabc")
Dim i As Integer = 0
While Not (m.Groups(i).Value = "")
' Add groups to string array.
results.Add(m.Groups(i).Value)
' Record character position.
matchposition.Add(m.Groups(i).Index)
i += 1
End While
' Display the capture groups.
For ctr As Integer = 0 to results.Count - 1
Console.WriteLine("{0} at position {1}", _
results(ctr), matchposition(ctr))
Next
' The example displays the following output:
' abc at position 3
' ab at position 3
' b at position 4
List<int> matchposition = new List<int>();
List<string> results = new List<string>();
// Define substrings abc, ab, b.
Regex r = new Regex("(a(b))c");
Match m = r.Match("abdabc");
for (int i = 0; m.Groups[i].Value != ""; i++)
{
// Add groups to string array.
results.Add(m.Groups[i].Value);
// Record character position.
matchposition.Add(m.Groups[i].Index);
}
// Display the capture groups.
for (int ctr = 0; ctr < results.Count; ctr++)
Console.WriteLine("{0} at position {1}",
results[ctr], matchposition[ctr]);
// The example displays the following output:
// abc at position 3
// ab at position 3
// b at position 4
В следующем примере кода используются именованные конструкции для выделения групп в строке формата "DATANAME:VALUE", в котором регулярное выражение разделяет двоеточие (:).
Dim r As New Regex("^(?<name>\w+):(?<value>\w+)")
Dim m As Match = r.Match("Section1:119900")
Console.WriteLine(m.Groups("name").Value)
Console.WriteLine(m.Groups("value").Value)
' The example displays the following output:
' Section1
' 119900
Regex r = new Regex("^(?<name>\\w+):(?<value>\\w+)");
Match m = r.Match("Section1:119900");
Console.WriteLine(m.Groups["name"].Value);
Console.WriteLine(m.Groups["value"].Value);
// The example displays the following output:
// Section1
// 119900
Capture
Класс Capture содержит результаты выделения отдельного подвыражения.
В этом примере выполняется цикл по коллекции Group, из каждого члена Group извлекается коллекция Capture, и переменным posn и length присваивается положение найденной последовательности в исходной строке и длина последовательности.
Dim r As Regex
Dim m As Match
Dim cc As CaptureCollection
Dim posn, length As Integer
r = New Regex("(abc)+")
m = r.Match("bcabcabc")
Dim i, j As Integer
i = 0
Do While m.Groups(i).Value <> ""
Console.WriteLine(m.Groups(i).Value)
' Grab the Collection for Group(i).
cc = m.Groups(i).Captures
For j = 0 To cc.Count - 1
Console.WriteLine(" Capture at position {0} for {1} characters.", _
cc(j).Length, cc(j).Index)
' Position of Capture object.
posn = cc(j).Index
' Length of Capture object.
length = cc(j).Length
Next j
i += 1
Loop
' The example displays the following output:
' abcabc
' Capture at position 6 for 2 characters.
' abc
' Capture at position 3 for 2 characters.
' Capture at position 3 for 5 characters.
Regex r;
Match m;
CaptureCollection cc;
int posn, length;
r = new Regex("(abc)+");
m = r.Match("bcabcabc");
for (int i=0; m.Groups[i].Value != ""; i++)
{
Console.WriteLine(m.Groups[i].Value);
// Capture the Collection for Group(i).
cc = m.Groups[i].Captures;
for (int j = 0; j < cc.Count; j++)
{
Console.WriteLine(" Capture at position {0} for {1} characters.",
cc[j].Length, cc[j].Index);
// Position of Capture object.
posn = cc[j].Index;
// Length of Capture object.
length = cc[j].Length;
}
}
// The example displays the following output:
// abcabc
// Capture at position 6 for 2 characters.
// abc
// Capture at position 3 for 2 characters.
// Capture at position 3 for 5 characters.
См. также
Ссылки
System.Text.RegularExpressions