2012-06-06 23 views
9

Tôi đang cố gắng hiểu một đoạn mã và bắt gặp cụm từ thông dụng này được sử dụng trong hàm preg_replace của PHP.cụm từ thông dụng (? <! -) có nghĩa là

'/(?<!-)color[^{:]*:[^{#]*$/i' 

chút này ... (?<!-) doesnt xuất hiện trong bất kỳ hướng dẫn sử dụng của tôi reg-exp. Bất cứ ai biết điều này có nghĩa là gì? (Google không trả lại bất kỳ thứ gì - Tôi không nghĩ biểu tượng hoạt động trong google.)

+6

Đó là một nụ cười của kẻ thù của Batman đánh vào mắt trái nhưng vẫn mỉm cười ... (nhưng nó sẽ phù hợp với bất kỳ ai đội mũ tương tự) –

+0

Để tham khảo: [Look-Around Assertions] (http: // perldoc .perl.org/perlre.html # Look-Around-Assertions) từ perlre, [Lookbehind tích cực và tiêu cực] (http://www.regular-expressions.info/lookaround.html#lookbehind) trên regular-expressions.info. – outis

Trả lời

10

?<! khi bắt đầu nhóm cha là negative lookbehind. Nó khẳng định rằng từ color (đúng, c trong động cơ) không phải là ký tự -.

Vì vậy, đối với một ví dụ cụ thể hơn, nó sẽ phù hợp với color trong chuỗi:

color 
+color 
someTextColor 

Nhưng nó sẽ thất bại trên một cái gì đó giống như -color hoặc background-color. Cũng lưu ý rằng động cơ sẽ không khớp về mặt kỹ thuật trước bất cứ điều gì trước c, nó chỉ đơn giản là khẳng định rằng nó không phải là một dấu nối. Đây có thể là một sự khác biệt quan trọng tùy thuộc vào ngữ cảnh (illustrated on Rubular with a trivial example; lưu ý rằng chỉ số b trong chuỗi cuối cùng được khớp, chứ không phải chữ cái trước).

6

Sử dụng PHP biểu thức chính quy tương thích perl (PCRE) cho các hàm preg_ *. Từ perldoc perlre:

"(?<!pattern)"
Một zero-width tiêu cực nhìn đằng sau khẳng định. Ví dụ:
"/(?<!bar)foo/" khớp với bất kỳ sự xuất hiện nào của "foo" có nghĩa là
không theo dõi "bar". Chỉ hoạt động với chiều rộng cố định-
phía sau.

+0

Tại sao bạn không trích dẫn [PCRE] (http://pcre.org/pcre.txt)? – Gumbo

+0

@Gumbo - Điều đó sẽ tốt hơn. Tôi trích dẫn perldoc vì tôi biết chính xác nơi để tìm thông tin. – jordanm

4

Tôi đang học biểu thức chính quy sử dụng mô-đun tái của Python!

http://docs.python.org/library/re.html

Matches nếu vị trí hiện tại trong chuỗi không được đi trước bởi một phù hợp cho .... này được gọi là một sự khẳng định lookbehind tiêu cực. Tương tự như xác nhận lookbehind tích cực, mẫu được chứa phải chỉ khớp với các chuỗi có độ dài cố định. Các mẫu bắt đầu với các xác nhận lookbehind phủ định có thể khớp ở đầu chuỗi đang được tìm kiếm.

+1

Python regex không phải là PCRE như PHP. – jordanm

+0

Có thể hiểu được, tôi chỉ nghĩ rằng tôi chỉ ra một thư viện biểu thức chính quy khác, tôi mới làm quen với biểu thức chính quy, vì vậy tôi đang cố gắng tìm hiểu nhiều nhất có thể về các cụm từ thông dụng trong hầu hết các ngôn ngữ chính. Python. – richardhsu

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