tôi chỉ tìm thấy một lỗi trong một số mã tôi đã không viết và tôi là một chút ngạc nhiên:Mẫu "tĩnh" không nên tĩnh?
Pattern pattern = Pattern.compile("\\d{1,2}.\\d{1,2}.\\d{4}");
Matcher matcher = pattern.matcher(s);
Mặc dù thực tế rằng mã này thất bại nặng nề trên dữ liệu đầu vào chúng tôi nhận (vì nó cố gắng tìm ngày theo định dạng 2011/01/17 và được trở lại những thứ như 10396/2011 và sau đó bị rơi vì nó không thể phân tích cú pháp ngày nhưng điều đó thực sự không phải là điểm của câu hỏi này;) tôi tự hỏi:
không phải là một trong các điểm của Pa ttern.compile là một tối ưu hóa tốc độ (bằng cách biên dịch trước khi biên dịch)?
không phải tất cả mẫu "tĩnh" là luôn là được biên dịch thành mẫu tĩnh?
Có rất nhiều ví dụ, tất cả khắp nơi trên web, nơi mà cùng một khuôn mẫu luôn được biên dịch lại bằng Pattern.compile mà tôi bắt đầu tự hỏi, nếu tôi nhìn thấy mọi thứ hay không.
Không phải là (giả định rằng chuỗi là tĩnh và do đó không động xây dựng):
static Pattern pattern = Pattern.compile("\\d{1,2}.\\d{1,2}.\\d{4}");
luôn preferrable trên một tài liệu tham khảo mẫu không tĩnh?
Lỗi trong mẫu là '.' khớp với bất kỳ thứ gì. Sử dụng '\ .' (hoặc đúng hơn' \\. '; Dấu gạch chéo ngược đầu tiên là dành cho Java) để sửa lỗi đó. –
@Donal Fellows: cảm ơn rất nhiều, tôi biết tôi biết, tôi chỉ muốn dán mã bị hỏng khi tôi đọc nó. Đối với tôi có ** hai ** WTF trong mã này: đầu tiên là việc biên dịch mẫu không phải là tĩnh và sau đó thứ hai là vấn đề tổng thể * regexp-now-you-have-two-problems * :) – Gugussee
Tất cả các câu trả lời nói rằng biên dịch tĩnh là tốt hơn là chính xác. Nhưng có một chút tối ưu hóa sớm ở đây. Nếu bạn thấy nhiều ví dụ trên web bằng cách sử dụng Pattern.compile không tĩnh, có thể vì nó đơn giản không phải là nút cổ chai thường xuyên, và có thể chỉ là một chút nhỏ để đọc hoặc duy trì theo cách đó. Luôn luôn đo lường trước khi tối ưu hóa, nếu không bạn có thể thấy rằng thời gian dành riêng cho việc khám phá vấn đề lớn hơn tất cả thời gian CPU mà chương trình của bạn sẽ chi tiêu trong Pattern.compile kết hợp với nhau :-). – Avi