방법: 문자열이 올바른 전자 메일 형식인지 확인
다음 예제에서는 문자열이 올바른 전자 메일 형식인지 확인합니다.
예제
이 예제에서는 문자열에 올바른 전자 메일 주소가 포함되어 있으면 true를 반환하고, 그렇지 않으면 false를 반환하지만 다른 작업을 수행하지 않는 IsValidEmail 메서드를 정의합니다. 전자 메일 주소가 올바른지 확인하기 위해 이 메서드는 Regex.IsMatch(String, String) 메서드를 호출하여 해당 주소가 정규식 패턴을 따르는지 확인합니다. 응용 프로그램이 데이터베이스에 주소를 저장하거나 ASP.NET 페이지에 표시하기 전에 IsValidEmail을 사용하여 유효하지 않은 문자가 들어 있는 전자 메일을 걸러낼 수 있습니다.
IsValidEmail 메서드는 전자 메일 주소가 올바른지 확인하기 위해 인증을 수행하는 것이 아니라 단지 형식이 전자 메일 주소에 적합한지 여부만 확인합니다.
Imports System.Text.RegularExpressions
Module RegexUtilities
Function IsValidEmail(strIn As String) As Boolean
' Return true if strIn is in valid e-mail format.
Return Regex.IsMatch(strIn, _
"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" + _
"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$")
End Function
End Module
using System;
using System.Text.RegularExpressions;
public class RegexUtilities
{
public static bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn,
@"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$");
}
}
이 예제에서 정규식 패턴 ^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$는 다음 표와 같이 해석할 수 있습니다.
패턴 |
설명 |
---|---|
^ |
문자열의 시작 부분에서 일치 항목 찾기를 시작합니다. |
(?("") |
첫 번째 문자가 따옴표인지 확인합니다. (?("")는 대체 구문의 시작 부분입니다. |
((?("")("".+?""@) |
첫 번째 문자가 따옴표이면 하나 이상의 문자와 끝 따옴표 앞에 있는 시작 따옴표를 찾습니다. 문자열은 @ 기호로 끝나야 합니다. |
|(([0-9a-zA-Z] |
첫 번째 문자가 따옴표가 아니면 a부터 z까지의 영문자 또는 0부터 9까지의 숫자를 찾습니다. |
(\.(?! \.)) |
다음 문자가 마침표이면 일치하게 됩니다. 마침표가 아니면 왼쪽에서 오른쪽으로 다음 문자를 검색하여 일치 항목을 계속 찾습니다. (?!\.)는 전자 메일 주소의 로컬 부분에 마침표 두 개가 연속으로 나타나지 않도록 하며 너비가 0인 음성 lookahead 어설션입니다. |
|[-!#\$%&'\*\+/=\? \^`\{\}\|~\w] |
다음 문자가 마침표가 아니면 단어 문자 또는 -!#$%'*+=?^`{}|~ 중 하나를 찾습니다. |
((\.(?! \.))|[-!#\$%'\*\+/=\? \^`\{\}\|~\w])* |
교체 패턴(마침표가 아닌 문자 또는 여러 문자 중 하나 앞에 마침표가 있는 패턴)을 0번 이상 찾습니다. |
@ |
@ 문자를 찾습니다. |
(?<=[0-9a-zA-Z]) |
@ 문자 앞의 문자가 영문자(A-Z, a-z) 또는 숫자(0-9)인 경우 일치 항목 찾기를 계속합니다. (?<=[0-9a-zA-Z]) 구문은 너비가 0인 긍정 lookbehind 어설션을 정의합니다. |
(?(\[) |
@ 뒤의 문자가 여는 대괄호인지 확인합니다. |
(\[(\d{1,3}\.){3}\d{1,3}\]) |
여는 대괄호이면 IP 주소(1자리에서 3자리까지의 숫자로 이루어진 4개의 집합이며 각 집합은 마침표로 구분됨)와 닫는 대괄호 앞에 있는 여는 대괄호를 찾습니다. |
|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}) |
@ 뒤의 문자가 여는 대괄호가 아니면 영숫자(A-Z, a-z 또는 0-9) 1개, 단어 문자 또는 하이픈 0개 이상, 영숫자(A-Z, a-z 또는 0-9) 1개와 마침표 1개로 구성된 패턴과 일치하는 항목을 찾습니다. 이 패턴은 한 번 이상 반복될 수 있으며 2개에서 6개까지의 영문자(a-z, A-Z)가 이 패턴 뒤에 있어야 합니다. 정규식에서 이 부분은 도메인 이름을 캡처하도록 되어 있습니다. |
코드 컴파일
IsValidEmail 메서드는 정규식 유틸리티 메서드의 라이브러리에 포함되거나 응용 프로그램에 전용 정적 또는 인스턴스 메서드로 포함될 수 있습니다. 이 메서드는 정규식 라이브러리에서 정적 메서드로 사용될 경우 다음과 같은 코드를 사용하여 호출할 수 있습니다.
Public Class Application
Public Shared Sub Main()
Dim emailAddresses() As String = { "david.jones@proseware.com", "d.j@server1.proseware.com", _
"jones@ms1.proseware.com", "j.@server1.proseware.com", _
"j@proseware.com9", "js#internal@proseware.com", _
"j_9@[129.126.118.1]", "j..s@proseware.com", _
"js*@proseware.com", "js@proseware..com", _
"js@proseware.com9", "j.s@server1.proseware.com" }
For Each emailAddress As String In emailAddresses
If RegexUtilities.IsValidEmail(emailAddress) Then
Console.WriteLine("Valid: {0}", emailAddress)
Else
Console.WriteLine("Invalid: {0}", emailAddress)
End If
Next
End Sub
End Class
' The example displays the following output:
' Valid: david.jones@proseware.com
' Valid: d.j@server1.proseware.com
' Valid: jones@ms1.proseware.com
' Invalid: j.@server1.proseware.com
' Invalid: j@proseware.com9
' Valid: js#internal@proseware.com
' Valid: j_9@[129.126.118.1]
' Invalid: j..s@proseware.com
' Invalid: js*@proseware.com
' Invalid: js@proseware..com
' Invalid: js@proseware.com9
' Valid: j.s@server1.proseware.com
public class Application
{
public static void Main()
{
string[] emailAddresses = { "david.jones@proseware.com", "d.j@server1.proseware.com",
"jones@ms1.proseware.com", "j.@server1.proseware.com",
"j@proseware.com9", "js#internal@proseware.com",
"j_9@[129.126.118.1]", "j..s@proseware.com",
"js*@proseware.com", "js@proseware..com",
"js@proseware.com9", "j.s@server1.proseware.com" };
foreach (string emailAddress in emailAddresses)
{
if (RegexUtilities.IsValidEmail(emailAddress))
Console.WriteLine("Valid: {0}", emailAddress);
else
Console.WriteLine("Invalid: {0}", emailAddress);
}
}
}
// The example displays the following output:
// Valid: david.jones@proseware.com
// Valid: d.j@server1.proseware.com
// Valid: jones@ms1.proseware.com
// Invalid: j.@server1.proseware.com
// Invalid: j@proseware.com9
// Valid: js#internal@proseware.com
// Valid: j_9@[129.126.118.1]
// Invalid: j..s@proseware.com
// Invalid: js*@proseware.com
// Invalid: js@proseware..com
// Invalid: js@proseware.com9
// Valid: j.s@server1.proseware.com