2011-11-21 35 views
5

Tôi đã có một chuỗi chứa:đơn giản - sử dụng String # quét để trích xuất địa chỉ email

@from = "John Doe <[email protected]>" 

Khi tôi làm:

@from.scan('/\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b/i') 

tôi nhận được không có kết quả. Tôi đang cố trích xuất địa chỉ email của chính nó.

Tôi đã thử xóa \ b nhưng điều này không hoạt động.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

17

biểu hiện của bạn hoạt động tốt: rubular

Vấn đề là các dấu ngoặc kép quanh biểu hiện thường xuyên của bạn có nghĩa là nó được hiểu như là một chuỗi văn bản đơn giản hơn là một biểu thức chính quy. Loại bỏ các dấu ngoặc kép giải quyết vấn đề: ideone

@from = "John Doe <[email protected]>" 
@from.scan(/\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b/i) { |x| puts x } 

Output:

 
[email protected] 
+1

Cụm từ thông dụng được xác định giữa/'s, vì vậy, nếu bạn đặt dấu ngoặc kép bên trong, nó sẽ không tạo thành regex và thay vào đó sẽ tìm kiếm văn bản thuần túy. –

6

Xin lỗi, tôi không có đủ đại diện cho bình luận, vì vậy tôi sẽ làm cho một câu trả lời:

Đối sử dụng trong tương lai, mọi người nên thực hiện một sửa đổi: Không hạn chế độ dài TLD thành 4. TLD mới đang được giới thiệu rất nhanh, bây giờ bạn nên sử dụng regex như sau:

@from.scan(/\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,}\b/i) 

Tất cả những gì tôi đã làm là xóa 4 ở cuối regex, đặt độ dài tối đa là 4 ký tự trên TLD. TLD được sử dụng gần như tất cả là dài 2, 3 hoặc 4 ký tự (.com, .org, .info, v.v.). Nhưng bây giờ, họ đang giới thiệu hàng tấn mới (.auction, .software, .business, v.v.)

Vì vậy, không ai hạn chế TLD chiều dài nữa (mặc dù để lại tối thiểu 2 ký tự vẫn tốt).

9

Đối với những người chỉ cần xử lý các địa chỉ như "John Doe <[email protected]>", có thể chứa tên hiển thị.

Sử dụng lớp Ruby Mail::Address.

require 'mail' 
#=> true 
a = Mail::Address.new("John Doe <[email protected]>") 
#=> #<Mail::Address:70264542184500 Address: |John Doe <[email protected]>| > 
a.address 
#=> "[email protected]" 
a.display_name 
#=> "John Doe" 
+1

Tôi đã sử dụng tính năng này gần đây nhưng đã gặp phải lỗi trong đó các ký tự UTF8 có vẻ không được hỗ trợ: https: //github.com/mikel/mail/issues/1014 ... – Nick

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