2015-05-14 14 views
5

tôi đang cố gắng để tạo ra một trận đấu regex được loại bỏ các lookahead hoàn toàn.Regex lookahead loại bỏ một trận đấu

\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 

Đây là trận đấu và đây là regex101 test tôi.

Nhưng khi email bắt đầu bằng - hoặc _ hoặc ., nó không được khớp hoàn toàn, không chỉ xóa các ký hiệu ban đầu. Bất kỳ ý tưởng được chào đón, tôi đã tìm kiếm trong nửa giờ qua, nhưng không thể tìm ra cách để thả toàn bộ email khi nó bắt đầu với những biểu tượng đó.

Trả lời

2

Bạn có thể sử dụng ranh giới từ gần @ với một lookbehind âm để kiểm tra xem chúng ta đang ở đầu của một chuỗi hoặc ngay sau khi một khoảng trắng, sau đó kiểm tra xem biểu tượng 1 không phải là bên trong lớp không mong muốn [^\s\-_.]:

(?<=^|\s)[^\s\-_.]\w*(?:[-+.]\w+)*\[email protected]\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)* 

Xem demo

Danh sách các trận đấu:

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

Ghi chú thêm về cách sử dụng và ký hiệu thay thế

Lưu ý rằng nó là thực hành tốt nhất để sử dụng càng ít thoát chars càng tốt trong regex, vì vậy, các [^\s\-_.] có thể được viết như [^\s_.-], với dấu nối ở phần cuối của các nhân vật lớp vẫn biểu thị dấu gạch nối theo nghĩa đen, không phải là một phạm vi. Ngoài ra, nếu bạn có kế hoạch để sử dụng các mô hình trong công cụ regex khác, bạn có thể thấy khó khăn với sự làm thay đổi lookbehind, và sau đó bạn có thể thay thế (?<=\s|^) với tương đương (?<!\S). Xem this regex:

(?<!\S)[^\s_.-]\w*(?:[-+.]\w+)*\[email protected]\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)* 

Và cuối cùng nhưng không kém, nếu bạn cần phải sử dụng nó trong JavaScript hoặc các ngôn ngữ khác không hỗ trợ lookarounds, thay thế các (?<!\S)/(?<=\s|^) với một (không) chụp nhóm (\s|^), quấn mô hình email toàn phần với một tập hợp các dấu ngoặc chụp và sử dụng ngôn ngữ có nghĩa là để lấy nội dung Nhóm 1:

(\s|^)([^\s_.-]\w*(?:[-+.]\w+)*\[email protected]\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*) 

Xem regex demo.

+0

thông minh sử dụng các '\ b' đó;) –

0

tôi sử dụng này cho nhiều địa chỉ email, tách biệt với ';':

([A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4};)* 

Đối với một email duy nhất:

[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4} 
+0

ở đâu giải pháp của bạn cho 'Nhưng khi một email bắt đầu bằng - hoặc _ hoặc. nó không hoàn toàn khớp với nó? – nhahtdh

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