2012-12-23 83 views
7

Cụm từ thông dụng sẽ trích xuất tên và email từ chuỗi như thế nào?Trích xuất email và tên bằng regex

[email protected] 
John <[email protected]> 
John Doe <[email protected]> 
"John Doe" <[email protected]> 

Có thể giả định rằng email hợp lệ. Tên sẽ được phân tách bằng email bởi một dấu cách và có thể được trích dẫn.

Kết quả dự kiến ​​là:

[email protected] 
Name: nil 
Email: [email protected] 

John <[email protected]> 
Name: John 
Email: [email protected] 

John Doe <[email protected]> 
Name: John Doe 
Email: [email protected] 

"John Doe" <[email protected]> 
Name: John Doe 
Email: [email protected] 

Đây là tiến bộ của tôi cho đến nay:

(("?(.*)"?)\s)?(<?(.*@.*)>?) 

(mà có thể được kiểm tra ở đây: http://regexr.com/?337i5)

+0

gì tất cả possiblities email hợp lệ là bạn có? Lưu ý rằng regex để xác thực tất cả các email có thể là rất lớn. Bạn cần phải làm rõ những gì tất cả các email bạn đang xem xét là chính xác. –

+0

Tôi không cần xác thực email. – hpique

+0

Liên kết của bạn không hoạt động. –

Trả lời

12

Các regex sau xuất hiện để làm việc trên tất cả các đầu vào và chỉ sử dụng hai nhóm chụp:

(?:"?([^"]*)"?\s)?(?:<?([email protected][^>]+)>?) 

http://regex101.com/r/dR8hL3

Nhờ @RohitJain và @burning_LEGION để giới thiệu ý tưởng về nhóm không bắt giữ và loại trừ ký tự tương ứng.

+0

hoạt động hoàn hảo trong dự án js mới nhất của tôi (cho đến nay) – electblake

0

Bạn có thể thử này (cùng một mã như của bạn nhưng được cải thiện), nhưng bạn cần phải kiểm tra các nhóm được trả lại sau khi kết hợp vì email được trả lại trong nhóm 2 hoặc nhóm 3, tùy thuộc vào việc tên có được cung cấp hay không.

(?:("?(?:.*)"?)\s)?<(.*@.*)>|(.*@.*) 
+0

Không có cách nào để giữ nó trong cùng một nhóm chụp? – hpique

+0

@hpique: Phụ thuộc vào ngôn ngữ và hương vị regex của bạn. Nó có thể được thực hiện bằng cách sử dụng cấu trúc '(? | ...)' nếu được hỗ trợ, nếu không có thể làm cho '<' and '>' tùy chọn.Nếu xác nhận được yêu cầu, điều này có thể được thực hiện bằng cách sử dụng các câu lệnh có điều kiện hoặc bất kỳ cấu trúc thông minh nào khác :-). –

1

sử dụng regex này "?([^"]*)"?\s*([^\s][email protected]+)

nhóm 1 chứa tên

nhóm 2 chứa email

+0

Tại sao lại là downvote? Nó khá gần. – hpique

+0

+1 để chỉ cho tôi đúng hướng. – hpique

0

Bằng cách này bạn có thể có hoặc không có tên, xóa dấu ngoặc kép.

\"*?(([\p{L}0-9-_ ]+)\"?)*?\b\ *<?([a-z0-9-_\.][email protected][a-z0-9-_\.]+\.[a-z]+)>? 
Các vấn đề liên quan