2015-10-13 28 views
9

Tôi đang cố gắng che giấu địa chỉ email bằng "*" nhưng tôi rất xấu ở regex.mặt nạ địa chỉ email trong java

input : [email protected] 
output : nil********@gmail.com 

Mã của tôi là

String maskedEmail = email.replaceAll("(?<=.{3}).(?=[^@]*[email protected])", "*"); 

nhưng nó đem lại cho tôi ra nil*******[email protected] tôi không nhận được whats nhận sai ở đây. Tại sao ký tự cuối cùng không được chuyển đổi? Cũng có thể ai đó giải thích nghĩa là tất cả các regex này

+6

Đây có phải là địa chỉ email thực của bạn? Nếu vậy, bạn có thể muốn xem xét thay đổi nó ... – nitzanms

Trả lời

9

Nhìn về phía trước (?=[^@]*[email protected]) yêu cầu ít nhất 1 ký tự ở đó trước @ (xem dấu chấm trước @).

Nếu bạn gỡ bỏ nó, bạn sẽ nhận được tất cả những biểu tượng dự kiến ​​sẽ thay thế:

(?<=.{3}).(?=[^@]*[email protected]) 

Đây là the regex demo (thay bằng *).

Tuy nhiên, regex không phải là regex phù hợp cho tác vụ. Bạn cần một regex mà sẽ phù hợp với từng nhân vật sau khi 3 ký tự đầu tiên lên đến @ đầu tiên:

(^[^@]{3}|(?!^)\G)[^@] 

Xem another regex demo, thay thế với $1*. Tại đây, [^@] khớp với bất kỳ ký tự nào không phải là @, vì vậy, chúng tôi không khớp với các địa chỉ như [email protected]. Chỉ những email đó sẽ được che dấu có 4 ký tự trong phần tên người dùng.

Xem IDEONE demo:

String s = "[email protected]"; 
System.out.println(s.replaceAll("(^[^@]{3}|(?!^)\\G)[^@]", "$1*")); 
+0

Thứ hai regex có thể được đơn giản hóa để '(^ [^ @] {3} | (?! ^) \ G) [^ @]' – nhahtdh

+0

@nhahtdh: Hoặc '(^ [^ @] {3} | (? ! ^) \ G) [^ @] (? = [^ @] * @) '. Điều thú vị ở đây là sau khi loại bỏ việc nhìn về phía trước số lượng các bước để hoàn thành việc tăng trận đấu. –

+0

Bạn cần phải chọn hộp kiểm "Vô hiệu hóa tối ưu hóa động cơ bên trong" trong trình gỡ lỗi. Sau khi bạn làm như vậy, họ có cùng số bước cho trường hợp bị lỗi và trường hợp không nhìn phía trước có ít bước hơn trong các trường hợp thành công. Trong Java, không có tối ưu hóa cho trường hợp với nhìn về phía trước. – nhahtdh

1

Tầm nhìn của bạn khá phức tạp. Hãy thử mã này:

public static void main(String... args) throws Exception { 
    String s = "[email protected]"; 
    s= s.replaceAll("(?<=.{3}).(?=.*@)", "*"); 
    System.out.println(s); 
} 

O/P:

nil********@gmail.com 
+0

Tại sao '\ w' thay vì chỉ đơn giản là' .'? Điều này dẫn đến "[email protected]" -> "foo*[email protected]" thay vì "foo****@gmail.com". – xehpuk

+0

@xehpuk - Ya. Đã không nghĩ về kịch bản đó. Đã thay đổi mã của tôi ngay bây giờ. Cảm ơn – TheLostMind

7

Nếu bạn xấu ở biểu thức thông thường, không sử dụng chúng :) Tôi không biết nếu bạn đã từng nghe báo giá:

Một số người, khi gặp phải sự cố, hãy nghĩ "Tôi biết, tôi sẽ sử dụng cụm từ thông dụng". Bây giờ họ có hai vấn đề.

(source)

Bạn có thể nhận được một biểu thức chính quy làm việc ở đây, nhưng bạn sẽ hiểu nó ngày hôm nay? Ngày mai? trong thời gian sáu tháng? Và sẽ đồng nghiệp của bạn?

An dễ thay thế là sử dụng một StringBuilder, và tôi cho rằng đó là một rất nhiều đơn giản hơn để hiểu những gì đang xảy ra ở đây:

StringBuilder sb = new StringBuilder(email); 
for (int i = 3; i < sb.length() && sb.charAt(i) != '@'; ++i) { 
    sb.setCharAt(i, '*'); 
} 
email = sb.toString(); 

"Bắt đầu từ nhân vật thứ ba, thay thế các ký tự với một * cho đến khi bạn đến cuối chuỗi hoặc @. "

Tất nhiên, tính năng này không hoạt động chính xác cho các địa chỉ email nơi phần địa phương ngắn hơn 3 ký tự - sau đó nó sẽ che khuất tên miền.

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