Chúng tôi có quy tắc sau đây để xác nhận tên của chúng tôi:Regex cho một tên người dùng tăng tiêu thụ CPU
- Tên truy cập có thể có ký tự chữ và
- Tên truy cập có thể có một dấu gạch dưới, gạch nối hoặc dấu chấm hết
- Còn bây giờ giả tên người dùng nằm trong ASCII
- Tên người dùng không thể bắt đầu hoặc kết thúc bằng khoảng thời gian
- Tên người dùng không thể bắt đầu, kết thúc hoặc có bất kỳ khoảng trắng nào
Chúng tôi có regex sau cho cùng:
^(([a-zA-Z0-9]+[_-]*[a-zA-Z0-9]*)([\\.]*[a-zA-Z0-9])*)+$
Bây giờ cố gắng để phù hợp với một chuỗi Đặc biệt, việc sử dụng CPU tăng lên theo cấp số nhân. Ví dụ:
[email protected]
Rõ ràng, khớp với một chuỗi như trên sẽ không thành công ngay lập tức nhưng tôi muốn biết tại sao lại sử dụng nhiều chu kỳ CPU đó. mã cuối cùng:
import java.util.regex.*;
public class R {
static final Pattern namePattern = Pattern.compile("^(([a-zA-Z0-9]+[_-]*[a-zA-Z0-9]*)([\\.]*[a-zA-Z0-9])*)+$");
public static void main(String... args) {
final String userName = "[email protected]";
Matcher matcher = namePattern.matcher(userName);
System.out.println(matcher.matches());
}
}
Trên một dòng khác nhau, tôi viết lại regex như dưới đây và nó hội chợ tốt:
^[\\w]+[\\w-_\\.]*[\\w]+$
Nó có thể là do có một hoặc nhiều hơn số lượng ('+') đóng gói toàn bộ regex, gây ra backtracking dẫn đến số lượng lớn các chu kỳ CPU bạn quan sát. – Vulcan
Điều này nghe có vẻ giống như một trường hợp của [backstacking thảm khốc] (http://www.regular-expressions.info/catastrophic.html) ... –
@Vulcan - Cảm ơn bạn đã mang định lượng toàn cầu '(+)' nhưng sau đó thực hiện nó cũng phụ thuộc vào độ dài của tên người dùng? Đơn giản như _username @ _ không thành công ngay lập tức. – user320599