다음을 통해 공유


정규식 클래스

업데이트: 2007년 11월

다음 단원에서는 .NET Framework 정규식 클래스에 대해 설명합니다.

Regex

Regex 클래스는 변경할 수 없는(읽기 전용) 정규식을 나타냅니다. 또한 다른 클래스의 인스턴스를 명시적으로 작성하지 않으면서 다른 정규식 클래스를 사용할 수 있도록 하는 정적 메서드도 포함합니다.

다음 코드 예제에서는 개체가 초기화될 때 Regex 클래스 인스턴스를 만들고 간단한 정규식을 정의합니다. \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 클래스의 Match.Success 속성을 사용하여 일치 항목을 찾았는지 여부를 나타냅니다.

' 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 메서드에 의해 반환됩니다.

다음 예제에서는 Regex 클래스의 Matches 메서드를 사용하여 입력 문자열에서 발견한 모든 일치 항목으로 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

CaptureCollection

CaptureCollection 클래스는 캡처된 부분 문자열의 시퀀스를 나타내며 단일 캡처링 그룹으로 수행한 캡처 집합을 반환합니다. 캡처링 그룹은 수량자로 인해 단일 검색에서 둘 이상의 문자열을 캡처할 수 있습니다. CaptureCollection 클래스의 개체인 Captures 속성은 MatchGroup 클래스의 멤버로 제공되어 캡처된 부분 문자열 집합에 쉽게 액세스할 수 있도록 합니다.

예를 들어, ((a(b))c)+(여기서 + 수량자는 하나 이상의 일치 항목을 지정함)을 사용하여 "abcabcabc" 문자열에서 일치 항목을 캡처하는 경우 부분 문자열의 일치하는 각 GroupCaptureCollection에는 세 개의 멤버가 포함됩니다.

다음 예제에서는 (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은 수량자를 사용하여 단일 검색에서 0개 또는 하나 이상의 문자열을 캡처할 수 있으므로 Capture 개체의 컬렉션을 포함합니다. GroupCapture에서 상속되므로 캡처링된 마지막 부분 문자열에 직접 액세스할 수 있습니다. Group 인스턴스 자체는 Captures 속성에서 반환하는 컬렉션의 마지막 항목과 같습니다.

Groups 속성에서 반환된 GroupCollection 개체를 인덱싱하면 Group 인스턴스가 반환됩니다. 인덱서는 그룹 번호이거나, "(?<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 컬렉션을 추출하고 Capture 문자열을 찾은 원래 문자열 위치마다 posn 변수를 할당하고 각 Capture 문자열의 길이에 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

기타 리소스

.NET Framework 정규식