На главную

.:: Меню ::.
Новости
Программы
Статьи
Полезные ссылки

Классы регулярных выражений (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 MatchCollection

Dim results(20) As String

Dim 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 Integer

For 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 System

Imports System.Text.RegularExpressions

Public 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 Sub

Public Shared Sub Main()

RunTest()

End Sub

End 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 System

Imports System.Text.RegularExpressions

Public Class RegexTest

Public Shared Sub RunTest()

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

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

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

Next i

End Sub

Public Shared Sub Main()

RunTest()

End Sub

End 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 Integer

Dim 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 = 0

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

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 j

i += 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

Новости сайта

Друзья сайта
Русский сайт системы KooBoo CMS

PROИТ - Office 365, AD, Active Directory, Sharepoint, C#, Powershell

Хостинг предоставлен VEDU.RU - Поволжским
Образовательным
Порталом





 © Центр ИТ, СИОТО, 2002-2009. Разработчики: webmaster(a)vedu.ru