Классы регулярных выражений (vb.net, c#)
Статьи / .NET / VB.NET / Регулярные выражения /
Назад
Regex
Класс Regex предоставляет неизменное регулярное выражение (только для чтения). В нем также содержатся статические методы, которые позволяют использовать другие классы регулярных выражений без явного создания экземпляров других классов.
В следующем примере кода создается экземпляр класса Regex и определяется простое регулярное выражение при инициализации объекта. Необходимо обратить внимание на использование дополнительной обратной косой черты в качестве escape-знака, который обозначает, что обратная косая черта в группе \s
должна обрабатываться как знак.
[Visual Basic]
' Declare object variable of type Regex.
Dim r As Regex' Create a Regex object and define its regular expression.r =
New Regex("\s2000")[C#]
// 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 для указания на то, найдено ли соответствие.
[Visual Basic]
' cCreate 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. ' (Character position 3 in this case.)Console.WriteLine("Found match at position " & m.Index.ToString())
End If[C#]
// 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.
// (Character position 3 in this case.)
Console.WriteLine("Found match at position " + m.Index);
}
MatchCollection
Класс MatchCollection предоставляет последовательность успешных не перекрывающихся соответствий. Данная коллекция является неизменной (только для чтения) и не имеет открытого конструктора. Экземпляры MatchCollection возвращаются свойством Regex.Matches.
В следующем примере метод Matches класса Regex используется для заполнения MatchCollection всеми соответствиями, найденными во входной строке. В данном примере коллекция копируется в массив строк, каждая из которых содержит соответствие, и в массив целых чисел, указывающий расположение каждого соответствия.
[Visual Basic]
Dim
mc As MatchCollectionDim results(20) As StringDim matchposition(20) As 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.Dim i As IntegerFor i = 0 To mc.Count - 1
' Add the match string to the string array.results(i) = mc(i).Value
' Record the character position where the match was found.matchposition(i) = mc(i).Index
Next i[C#]
MatchCollection mc;
String[] results = new String[20];
int[] matchposition = new int[20];
// 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[i] = mc[i].Value;
// Record the character position where the match was found.
matchposition[i] = mc[i].Index;
}
GroupCollection
Класс GroupCollection предоставляет коллекцию найденных групп и возвращает набор групп как одно соответствие. Данная коллекция является неизменной (только для чтения) и не имеет открытого конструктора. Экземпляры GroupCollection возвращены в коллекцию, которая возвращает свойство Match.Groups.
В следующем примере текстового приложения находится и печатается число групп, соответствующий регулярному выражению. Как извлечь каждое из найденных соответствий из коллекции группы см. в примере Capture Collection следующего раздела.
[Visual Basic]
Imports
SystemImports System.Text.RegularExpressionsPublic Class RegexTest
Public Shared Sub RunTest()
' 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.ToString())
End SubPublic Shared Sub Main()RunTest()
End SubEnd Class[C#]
using System;
using System.Text.RegularExpressions;
public class RegexTest
{
public static void RunTest()
{
// 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);
}
public static void Main()
{
RunTest();
}
}
В этом примере на выходе выдается следующий результат.
[Visual Basic]
Number of groups found = 3
[C#]
Number of groups found = 3
CaptureCollection
Класс CaptureCollection предоставляет последовательность найденных подстрок и возвращает наборы соответствий отдельно для каждой группы. Если в регулярном выражении используются кванторы, такая группа может сохранить более одной строки для одного найденного соответствия. Свойство Captures, объект класса CaptureCollection, также является объектом классов Match и Group и обеспечивает доступ к набору захваченных подстрок.
Например, если используется регулярное выражение((a(b))c)+
(где квантор + задает одно или несколько соответствий) для поиска соответствий в строке "abcabcabc", CaptureCollection для каждой соответствующей группы будет содержать по три члена.
В следующем примере текстового приложения используется регулярное выражение (Abc)+
для поиска одного или нескольких соответствий в строке "XYZAbcAbcAbcXYZAbcAb". В данном примере показано применение свойства Captures для возврата нескольких групп найденных подстрок.
[Visual Basic] Imports SystemImports System.Text.RegularExpressionsPublic Class RegexTestPublic Shared Sub RunTest()Dim counter As IntegerDim m As MatchDim cc As CaptureCollectionDim 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
' Print the number of groups.Console.WriteLine("Captured groups = " & gc.Count.ToString())
' Loop through each group.Dim i, ii As IntegerFor i = 0 To gc.Count - 1cc = gc(i).Captures
counter = cc.Count
' Print number of captures in this group.Console.WriteLine("Captures count = " & counter.ToString())
' Loop through each capture in group. For ii = 0 To counter - 1
' Print capture and position.Console.WriteLine(cc(ii).ToString() _
& " Starts at character " & cc(ii).Index.ToString())
Next iiNext iEnd SubPublic Shared Sub Main() RunTest()
End SubEnd Class[C#]
using System;
using System.Text.RegularExpressions;
public class RegexTest
{
public static void RunTest()
{
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;
// Print 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;
// Print number of captures in this group.
Console.WriteLine("Captures count = " + counter.ToString());
// Loop through each capture in group.
for (int ii = 0; ii < counter; ii++)
{
// Print capture and position.
Console.WriteLine(cc[ii] + " Starts at character " +
cc[ii].Index);
}
}
}
public static void Main() {
RunTest();
}
}
Этот пример выдает следующий результат.
[Visual Basic]
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
[C#]
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 возвращаются свойством Match.Groups(groupnum) или Match.Groups("groupname"), если используется конструкция "(?<groupname>)".
В следующем примере кода используются вложенные конструкции групп для поиска и сохранения подстрок.
[Visual Basic] Dim
matchposition(20) As IntegerDim results(20) As 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 = 0While Not (m.Groups(i).Value = "") ' Copy groups to string array.results(i) = m.Groups(i).Value
' Record character position. matchposition(i) = m.Groups(i).Index
i = i + 1
End While[C#]
int[] matchposition = new int[20];
String[] results = new String[20];
// 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++)
{
// Copy groups to string array.
results[i]=m.Groups[i].Value;
// Record character position.
matchposition[i] = m.Groups[i].Index;
}
В этом примере на выходе возвращается следующий результат.
[Visual Basic]
results(0) = "abc" matchposition(0) = 3
results(1) = "ab" matchposition(1) = 3
results(2) = "b" matchposition(2) = 4
[C#]
results[0] = "abc" matchposition[0] = 3
results[1] = "ab" matchposition[1] = 3
results[2] = "b" matchposition[2] = 4
В следующем примере кода используются именованные конструкции для поиска групп в строке формата "DATANAME:VALUE". В регулярном выражении двоеточие (:) используется в качестве разделителя.
[Visual Basic] Dim
r As New Regex("^(?<name>\w+):(?<value>\w+)")Dim m As Match = r.Match("Section1:119900")[C#]
Regex r = new Regex("^(?<name>\\w+):(?<value>\\w+)");
Match m = r.Match("Section1:119900");
Это регулярное выражение возвращает на выходе следующий результат.
[Visual Basic]
m.Groups("name").Value = "Section1"
m.Groups("value").Value = "119900"
[C#]
m.Groups["name"].Value = "Section1"
m.Groups["value"].Value = "119900"
Capture
Класс Capture содержит результаты для одной регулярной группы.
В этом примере выполняется цикл по коллекции Group, из каждого члена Group извлекается коллекция Capture, и переменным posn и length присваивается положение найденной последовательности в исходной строке и длина последовательности.
[Visual Basic]
Dim
r As RegexDim m As MatchDim cc As CaptureCollectionDim posn, length As Integerr =
New Regex("(abc)*")m = r.Match("bcabcabc")
Dim i, j As Integeri = 0
While m.Groups(i).Value <> ""' Grab the Collection for Group(i).cc = m.Groups(i).Captures
For j = 0 To cc.Count - 1' Position of Capture object.posn = cc(j).Index
' Length of Capture object.length = cc(j).Length
Next ji += 1
End While[C#]
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++)
{
// Capture the Collection for Group(i).
cc = m.Groups[i].Captures;
for (int j = 0; j < cc.Count; j++)
{
// Position of Capture object.
posn = cc[j].Index;
// Length of Capture object.
length = cc[j].Length;
}
}
Источник MSDN