2008-12-15 37 views
10

Tôi đang làm việc trên một dự án nhỏ trong VB.Net, nơi tôi nhận được đầu vào từ một hộp văn bản và cần xác minh rằng đây là địa chỉ email.Xác thực e-mail với biểu thức chính quy VB.Net

Tôi thấy cụm từ này "^ [_ a-z0-9 -] + (. [_ A-z0-9 -] +) @ [a-z0-9 -] + (. [A-z0-9 -] +) (. [Az] {2,4}) $ ", nhưng tôi không thể tìm thấy bất kỳ cách nào để kiểm tra xem nó có vượt qua hay không.

Tôi muốn một số mã như:

if not txtEmail.text = regexString then 
    something happens.. 
else 
    something else happens.. 
end if 
+1

Tôi có thể chỉ cho bạn một thực tế rằng nếu bạn google cho " vb.net regex ", liên kết _first_ cung cấp cho bạn hướng dẫn từng bước về vấn đề này? – Svante

+2

Đó là một câu hỏi hay để có trên hồ sơ tại StackOverflow - Tôi thấy không có gì sai khi hỏi điều này ở đây. – Jeffrey

Trả lời

18

Sử dụng các lớp System.Text.RegularExpressions.Regex:

Function IsEmail(Byval email as string) as boolean 
    Static emailExpression As New Regex("^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$") 

    return emailExpression.IsMatch(email) 
End Function 

Điều quan trọng nhất để hiểu về câu trả lời này là tôi đã không viết các biểu thức chính quy bản thân mình. Có rất nhiều cách sai lầm có vẻ đúng, và có một số mức độ chi tiết mà bạn có thể thực hiện việc này. Ví dụ: bạn có muốn giới hạn điều này cho các tên miền cấp cao nhất hợp lệ hay không và nếu có, bạn sẽ tính toán thực tế đến mức chúng thỉnh thoảng thêm các TLD mới như thế nào? Nếu cụm từ thông dụng là địa điểm thích hợp nhất cho thử nghiệm đó hoặc phải có mã riêng cho kiểm tra đó? Ngay cả những biểu hiện trong câu trả lời này bây giờ là rất cũ vì nó ban đầu được tác giả. Những gì tôi khuyên bạn nên tìm một tài nguyên mà bạn có thể sử dụng cho biểu thức mà bạn biết sẽ được duy trì.

+3

'Nếu… Sau đó, trả lại True Else Return False' chắc chắn nằm trong top 10 của anti-patterns. : -/ –

+0

Vâng: đó là một thói quen xấu mà tôi có được tại buổi biểu diễn cuối cùng của tôi, nơi chính sách ngăn không cho trả lại kết quả của các biểu thức boolean trực tiếp. Sửa mẫu. –

+0

Tôi thấy rằng nó cần phải là "Như New System.Text.RegularExpressions.Regex", nơi nó nói "Như New Regex" Thx cho sự giúp đỡ :) – AndersE

5

Có một trang web tuyệt vời cho loại điều này, http://regexlib.com/. Nó không chỉ có ứng dụng trình kiểm tra mà bạn có thể dán vào biểu thức chính quy và kiểm tra nó, nhưng cũng có một thư viện biểu thức chính quy mà bạn có thể sử dụng với phản hồi của cộng đồng về tính hợp lệ của chúng, v.v. Tôi đến đây khi tôi cần một biểu thức chính quy nhanh.

Ngoài ra, nếu bạn đang nghĩ đến việc tự mình phát triển các biểu thức chính quy, có một công cụ tuyệt vời được gọi là Regex Buddy sẽ cho phép bạn tạo và kiểm tra cụm từ thông dụng của mình bằng cách sử dụng dễ hiểu giải thích tiếng Anh của regex.

+0

Tôi đã gặp trường hợp email bị thất bại trong regex đơn giản ở trên"^[_a-z0-9 -] + (. [a-z0-9 -] +) @ [a-z0-9 -] + (. [a-z0-9 -] +) * (. [az] { 2,4}) $ ". Quay trở lại đây tôi đã sử dụng regexlib rằng Anderson đã tử tế, đủ để chia sẻ và tìm kiếm các regex "email" được đánh giá cao nhất. Có 4 lượt truy cập và đây là một trong những đầu danh sách và làm việc tốt nhất cho tôi: "^ ((([! # $% & '* + \ -/=?^_' {|} ~ \ W]) | ([! # $% & '* + \ -/=?^_ '{|} ~ \ w] [! # $% &' * + \ -/=?^_' {|} ~ \. \ w ] {0,} [! # $% & '* + \ -/=?^_ '{|} ~ \ W])) [@] \ w + ([-.] \ W +) * \. \ W + ([-.] \ w +) *) $ "nguồn và trang thử nghiệm tại đây: http://regexlib.com/RETester.aspx?regexp_id=2558 –

2

Regex đó không thực sự hoàn thành ... trên thực tế ... hầu hết không phải là (hãy xem this article hoặc this one).

Trừ khi bạn thực sự thích thú, regex không phải là cách thích hợp để xác thực địa chỉ email.

+1

Bạn có thể nói cho mọi người biết cách nào để xác thực địa chỉ email trong .net ? –

-2

Địa chỉ email: RFC 2822 (đơn giản) Khớp với địa chỉ email thông thường. Không kiểm tra tên miền cấp cao nhất. Yêu cầu tùy chọn "không phân biệt dạng chữ" được BẬT.

Dim FoundMatch As Boolean 
Try 
    FoundMatch = Regex.IsMatch(txtEmail.text, "\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase) 
Catch ex As ArgumentException 
    'Syntax error in the regular expression 
End Try 

If Not FoundMatch Then 
    Error = True 
Else 
    Error = False 
End If 
+0

Biểu thức bị hỏng (ví dụ: không cho phép địa chỉ chỉ dành cho tld). Xem http://stackoverflow.com/questions/369543/validating-e-mail-with-regular-expression-vbnet#369614 – bzlm

+0

Ví dụ không bị hỏng. Nó không kiểm tra các tên miền cấp cao nhất. Như tôi đã đề cập trong bình luận của tôi. Xem bình luận khác của tôi cho một trong đó. – Mick

+3

Tôi sẽ không bao giờ hiểu tại sao mọi người sẽ viết một câu lệnh IF giống như câu cuối cùng của bạn trong đoạn mã này. Điều đó thật điên rồ. Nó phải là: Lỗi = Không tìm thấyMatch –

6

Pick regex yêu thích của bạn từ my article on matching email addresses with a regex, và cắm nó vào mã này Visual Basic:

If Regex.IsMatch(SubjectString, "regex") Then 
    Error = False 
Else 
    Error = True 
End If 

Các regex tốt nhất để phù hợp với một địa chỉ email là một vấn đề nhức nhối mà tôi không muốn nhận được vào đây Bài viết của tôi thảo luận về các vấn đề mà bạn nên biết khi chọn một regex. Regex trong câu trả lời của Joel Coehoorn chắc chắn không phải là một câu trả lời hay.

+0

Mô tả tốt đẹp của thương mại khác nhau-off trên trang web liên kết. – WileCau

5

Có thể off-topic vì nó không phải là một giải pháp regex, nhưng bạn chỉ có thể sử dụng một số được xây dựng trong các tính năng của .NET 2.0:

try 
{ 
    MailAddress email = new MailAddress(txtEmail.Text); 
} 
catch(FormatException fe) 
{ 
    // output error 
} 
+1

Đây là ở mọi nơi trong dự án tôi đang làm việc vào lúc này và tôi đang tách nó ra. Tôi không thấy làm thế nào ném một ngoại lệ là logic tốt hoặc kỹ thuật xác nhận, ngoài bất cứ điều gì nó là một nhiệm vụ tốn kém. Cảm thấy tự do để sửa tôi mặc dù –

+0

Tôi đã có một thời gian khó khăn để làm điều này để phá vỡ, tôi đã thông qua nó tất cả các loại email rác và nó gobbled chúng lên mà không có ngoại lệ và tôi loại bỏ này từ mã của tôi. –

Các vấn đề liên quan