Không hẳn vậy. Khi sử dụng Regex thì phải luôn nhớ rằng nó:
2. Tham lam. Phải biết cách giới hạn độ tham lam của nó.
Theo tôi không cần. Tất nhiên để thay đổi mặc định "tham lam" thành "chừng mực" thì phải biết là phải thêm ?. Nhưng ý tôi là không phải cứ dùng *, +, ?, {n,}, {n,m} là phải thêm ? để thay đổi thành "chừng mực"
Chỉ có 2 trường hợp:
1. Nếu thay đổi mặc định thì kết quả khác nhau. Tức nếu để mặc định thì có kết quả a, nếu thay mặc định thì kết quả b, mà Len(a) > Len(b). Rõ ràng người dùng bắt buộc phải quyết định để mặc định hay thay đổi. Nếu anh ta có nhu cầu lấy đoạn khớp dài nhất có thể thì rõ rành anh ta phải để mặc định.. Ngược lại thì phải thay đổi mặc định.
Trong trường hợp này dù người dùng chọn gì thì đó là lựa chọn vì nhu cầu của anh ta chứ không là lựa chọn vì sự tối ưu của regex.
2. Nếu thay đổi mặc định thì kết quả như nhau. Tức nếu để mặc định thì có kết quả a, nếu thay mặc định thì kết quả cũng là a. Kết quả trong chủ đề này chính là loại này.
Chỉ có 2 trường hợp:
- Người dùng thay đổi mặc định. Khi tìm được đoạn a khớp với pattern thì regex kết thúc
- Người dùng không thay đổ mặc định. Lúc này sau khi tìm được a thì regex vẫn cố tiếp tục mở rộng thêm. Nhưng chỉ cần mở rộng thêm 1 ký tự thôi thì "a<1 ký tự>" sẽ không còn khớp với pattern nữa. Lúc này regex kết thúc.
Như vậy trong trường hợp này nếu người dùng không thay đổi mặc định thì chỉ tốn thêm 1 bước kiểm tra khi mở rộng thêm 1 ký tự (nên nhớ là khi cố mở rộng thêm mà regex thấy không khớp với pattern nữa thì nó ngừng chứ không phải mở rộng tiếp đến cuối chuỗi. Vì khi "a<1 ký tự>" không khớp thì "a<nhiều ký tự>" không bao giờ khớp). Cái mất mát này nó còn nhỏ hơn cả "chả là gì cả" nên chả ai viết pattern lại thay đổi mặc định chỉ để tiết kiệm nó.
Không phải cứ dùng *, +, ?, {n,}, {n,m} là phải thêm ? để thay đổi mặc định. Trên thực tế người ta chỉ thay đổi mặc định khi gặp trường hợp 1, và cũng chỉ khi người ta muốn lấy đoạn khớp ngắn nhất có thể. Nhưng đó là sự bắt buộc vì nhu cầu của người dùng chứ không phải vì sự tối ưu của regex.