언어
다음 예제에서는 입력 문자열을 검색하여 모든 href="..." 값과 문자열에서의 해당 위치를 표시합니다.
Warning
신뢰할 수 없는 입력을 무제한으로 사용하면 System.Text.RegularExpressions 애플리케이션에 서비스 거부 공격이 적용될 수 있습니다. 신뢰할 수 없는 입력으로 .NET 정규식을 안전하게 사용하는 방법에 대한 지침은 .NET 정규식에 대한 모범 사례를 참조하세요.
Regex 개체
DumpHRefs 메서드는 사용자 코드에서 여러 번 호출될 수 있으므로 static(Visual Basic에서는 Shared) Regex.Match(String, String, RegexOptions) 메서드를 사용합니다. 이렇게 하면 정규식 엔진에서 정규식을 캐시할 수 있으며 메서드를 호출할 때마다 새 Regex 개체를 인스턴스화하는 오버헤드를 방지할 수 있습니다. 그런 다음 Match 개체를 사용하여 문자열의 모든 일치 항목을 순회합니다.
private static void DumpHRefs(string inputString)
{
string hrefPattern = @"href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>[^>\s]+))";
try
{
Match regexMatch = Regex.Match(inputString, hrefPattern,
RegexOptions.IgnoreCase | RegexOptions.Compiled,
TimeSpan.FromSeconds(1));
while (regexMatch.Success)
{
Console.WriteLine($"Found href {regexMatch.Groups[1]} at {regexMatch.Groups[1].Index}");
regexMatch = regexMatch.NextMatch();
}
}
catch (RegexMatchTimeoutException)
{
Console.WriteLine("The matching operation timed out.");
}
}
Private Sub DumpHRefs(inputString As String)
Dim hrefPattern As String = "href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>[^>\s]+))"
Try
Dim regexMatch = Regex.Match(inputString, hrefPattern,
RegexOptions.IgnoreCase Or RegexOptions.Compiled,
TimeSpan.FromSeconds(1))
Do While regexMatch.Success
Console.WriteLine($"Found href {regexMatch.Groups(1)} at {regexMatch.Groups(1).Index}.")
regexMatch = regexMatch.NextMatch()
Loop
Catch e As RegexMatchTimeoutException
Console.WriteLine("The matching operation timed out.")
End Try
End Sub
다음 예제에서는 메서드에 대한 호출을 보여 줍니다 DumpHRefs .
public static void Main()
{
string inputString = "My favorite web sites include:</P>" +
"<A HREF=\"https://learn.microsoft.com/en-us/dotnet/\">" +
".NET Documentation</A></P>" +
"<A HREF=\"http://www.microsoft.com\">" +
"Microsoft Corporation Home Page</A></P>" +
"<A HREF=\"https://devblogs.microsoft.com/dotnet/\">" +
".NET Blog</A></P>";
DumpHRefs(inputString);
}
// The example displays the following output:
// Found href https://learn.microsoft.com/dotnet/ at 43
// Found href http://www.microsoft.com at 114
// Found href https://devblogs.microsoft.com/dotnet/ at 188
Public Sub Main()
Dim inputString As String = "My favorite web sites include:</P>" &
"<A HREF=""https://learn.microsoft.com/en-us/dotnet/"">" &
".NET Documentation</A></P>" &
"<A HREF=""http://www.microsoft.com"">" &
"Microsoft Corporation Home Page</A></P>" &
"<A HREF=""https://devblogs.microsoft.com/dotnet/"">" &
".NET Blog</A></P>"
DumpHRefs(inputString)
End Sub
' The example displays the following output:
' Found href https://learn.microsoft.com/dotnet/ at 43
' Found href http://www.microsoft.com at 114
' Found href https://devblogs.microsoft.com/dotnet/ at 188
정규식 패턴 href\s*=\s*(?:["'](?<1>[^"']*)["']|(?<1>[^>\s]+)) 는 다음 테이블과 같이 해석됩니다.
| 패턴 | Description |
|---|---|
href |
리터럴 문자열 "href"를 묶습니다. 일치 항목은 대/소문자를 구분하지 않습니다. |
\s* |
0개 이상의 공백 문자가 일치하는지 확인합니다. |
= |
등호를 맞추세요. |
\s* |
0개 이상의 공백 문자가 일치하는지 확인합니다. |
(?: |
캡처하지 않는 그룹을 시작합니다. |
["'](?<1>[^"']*)["'] |
따옴표나 아포스트로피를 묶은 다음 따옴표나 아포스트로피 이외의 문자와 일치하는 캡처링 그룹, 따옴표 또는 아포스트로피를 붙입니다. 이름이 지정된 1 그룹이 이 패턴에 포함됩니다. |
| | | 이전 식 또는 다음 식 중 하나와 일치하는 불리언 OR입니다. |
(?<1>[^>\s]+) |
부정된 집합을 사용하여 보다 큰 기호 또는 공백 문자 이외의 문자를 일치시키는 캡처링 그룹입니다. 이름이 지정된 1 그룹이 이 패턴에 포함됩니다. |
) |
캡처하지 않는 그룹을 종료합니다. |
일치 결과 클래스
검색 결과는 검색에서 Match 추출한 모든 부분 문자열에 대한 액세스를 제공하는 클래스에 저장됩니다. 또한 검색 중인 문자열과 사용 중인 정규식을 기억하므로 메서드를 Match.NextMatch 호출하여 마지막 검색이 종료된 위치부터 다른 검색을 수행할 수 있습니다.
명시적으로 명명된 캡처
기존 정규식에서 캡처 괄호는 순차적으로 자동으로 번호가 매겨집니다. 이로 인해 두 가지 문제가 발생합니다. 먼저 괄호 집합을 삽입하거나 제거하여 정규식을 수정하는 경우 번호가 매겨진 캡처를 참조하는 모든 코드를 새 번호 매기기를 반영하도록 다시 작성해야 합니다. 둘째, 서로 다른 괄호 집합을 사용하여 허용되는 일치 항목에 대해 두 개의 대체 식을 제공하는 경우가 많으므로 두 식 중 실제로 결과를 반환한 식을 확인하기 어려울 수 있습니다.
이러한 문제를 해결하기 위해 클래스는 Regex 지정된 슬롯에 일치 항목을 캡처하는 구문을 (?<name>…) 지원합니다(슬롯은 문자열 또는 정수로 이름을 지정할 수 있고 정수는 더 빨리 회수할 수 있음). 따라서 동일한 문자열에 대한 대체 일치 항목은 모두 동일한 위치로 전달될 수 있습니다. 충돌이 발생할 경우 슬롯에 삭제된 마지막 일치 항목은 성공적인 일치입니다. (그러나 단일 슬롯에 대해 일치하는 여러 항목의 전체 목록을 확인할 수 있습니다. 자세한 내용은 Group.Captures 컬렉션을 참조하세요.)
참고하십시오
.NET