2010-09-26 20 views
9

Tôi gặp vấn đề với xác nhận lookahead (? =). Ví dụ, tôi có biểu hiện:Regex - xác nhận lookahead

/Win(?=2000)/ 

Nó phù hợp Win, nếu biểu thức là như Win2000, Win2000fgF. Tôi có biểu hiện tiếp theo:

^(?=.*\d)(?=.*[a-z]).*$ 

Nó phù hợp cho chữ số và chữ thường, ví dụ: 45dF, 4Dd. Nhưng tôi không biết, tại sao nó hoạt động và phù hợp với tất cả các nhân vật :) Tôi không có ký tự, trước đây là (?=.*\d). Tôi nghĩ, chỉ biểu thức này sẽ hoạt động:

^.\*(?=.*\d)(?=.*[a-z]).*$ 

(với \* trước khi biểu thức).

Bạn có thể giải thích nó không?

Trả lời

38

Giả sử chúng ta là công cụ regex và áp dụng regex ^(?=.*\d)(?=.*[a-z]).*$ cho chuỗi 2a.

Bắt đầu từ vị trí 0 (trước khi ký tự đầu tiên):

  1. ^: Hãy chắc chắn rằng chúng ta đang ở đầu của chuỗi: OK
  2. (?=: Hãy kiểm tra xem regex sau đây có thể phù hợp. ..
  3. .*: khớp với bất kỳ số ký tự nào ->2a. ĐƯỢC.
  4. \d: Không, chúng tôi đã ở cuối. Hãy quay lại một ký tự: a -> Không, không khớp. Quay lại một số khác: 2 -> MATCH!
  5. ): Kết thúc lookahead, khớp thành công. Chúng tôi đang vẫn còn ở vị trí 0!
  6. (?=: Hãy kiểm tra xem regex sau đây có thể phù hợp với ...
  7. .*: phù hợp với bất kỳ số lượng ký tự ->2a. ĐƯỢC.
  8. [a-z]: Không, chúng tôi đã kết thúc. Hãy quay lại một ký tự: a -> MATCH!
  9. ): Kết thúc lookahead, khớp thành công. Chúng tôi đang vẫn còn ở vị trí 0!
  10. .*: khớp với bất kỳ số ký tự nào ->2a -> MATCH!
  11. $: Hãy xem - chúng ta đang ở cuối chuỗi? Vâng chúng tôi! -> MATCH!
  12. Xin chào, chúng tôi đã đến cuối regex. Tuyệt quá. Đã hoàn tất trận đấu!
+0

Cảm ơn bạn đã giải thích tuyệt vời. Bạn có thể cho tôi biết, tại sao^(? =. * \ D) (? =. * [A-z]) $ (không có. * Ở cuối) không hoạt động cho 2a? Regex này phải phù hợp? – luk4443

+4

Vâng, hãy tưởng tượng bạn rời khỏi bước 10 - công cụ regex vẫn ở vị trí 0, vì vậy nó không khớp với '$'. –

+0

Ok, cảm ơn bạn :) – luk4443

3

hình ảnh không khớp, chúng khẳng định.

điều này có nghĩa là nếu bạn sử dụng một lookahead, bạn cần một cái gì đó mà sẽ phù hợp với những gì bạn muốn nếu bạn muốn tiếp tục.

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