2011-07-04 41 views
5

Một thời gian ngắn tôi trả lời this question về SO, nhưng tôi vẫn chưa tìm ra lý do tại sao câu trả lời của tôi hoạt động.Tại sao (?! ^) Tương đương với (? <! ^)?

Vì một lý do nào đó, dấu hiệu tiêu cực cho sự bắt đầu của chuỗi hoạt động giống như giao diện phủ định.

Ví dụ, trong PHP

preg_replace("/(?!^)12/", "ab", "12345"); // 12345 
preg_replace("/(?<!^)12/", "ab", "12345"); // 12345 
preg_replace("/(?!1)23/", "ab", "12345"); // 1ab45 
preg_replace("/(?<!1)23/", "ab", "12345"); // 12345 

Tôi biết nó không phải là câu hỏi hữu ích nhất từng được hỏi, nhưng điều này đã được cằn nhằn tôi trong một vài tuần.

Trả lời

8

Dấu mũ là xác nhận chiều rộng bằng 0. Trong thực tế lookaheads và lookbehinds là zero chiều rộng là tốt. Vì vậy, trong trường hợp này, không quan trọng nếu bạn đang nhìn về phía trước hay phía sau, bạn vẫn đang nhìn vào cùng một vị trí nhân vật.

Điều này được giải thích khá rõ trong this article.

+0

Cảm ơn, đó là loại có ý nghĩa, nhưng tôi nghĩ rằng tôi cần một phần còn lại của đêm để cho nó chìm vào. –

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