2012-02-17 25 views
6

Tôi tìm thấy mã regex này tìm thấy nhận xét trong trang CSS grammar của w3.org.Giải thích regex tìm thấy nhận xét CSS

\/\*[^*]*\*+([^/*][^*]*\*+)*\/ 

Nó là khá dài và hơi khó hiểu. Tôi chỉ muốn đặt

\/\*.*\*\/ 

để tìm ý kiến, nhưng khi tôi thử nghiệm nó trong RegexPal nó tìm thấy bình luận dòng đơn và không nhiều dòng bình luận trong khi regex ban đầu có thể tìm thấy tất cả các loại ý kiến.

Tôi không hiểu những gì phần

+([^/*][^*]*\*+)* 

bên trong regex ban đầu không. Bất cứ ai có thể giải thích cho tôi điều này?

+2

[Trình phân tích biểu thức chính quy] (http://xenon.stanford.edu/~xusch/regexp/analyzer.html) – kev

+0

@Kev: liên kết tuyệt vời, cảm ơn! –

+0

@kev Liên kết đó sẽ rất hữu ích cho tôi trong tương lai .. Cảm ơn rất nhiều. :) – Vigneshwaran

Trả lời

6

Lý do bạn thấy chỉ dòng bình luận là, trong biểu thức thông thường điển hình, . phù hợp với bất cứ điều gì trừ dòng mới; trong khi cái còn lại sử dụng một lớp nhân vật phủ định khớp với bất kỳ thứ gì trừ các ký tự được chỉ định và do đó có thể khớp với dòng mới.

Tuy nhiên, nếu bạn sửa lỗi đó (thường có tùy chọn cho nhiều dòng hoặc "giống như một dòng đơn"), bạn sẽ thấy rằng nó khớp với từ /* của nhận xét đầu tiên cho số */ của nhận xét cuối cùng ; bạn sẽ phải sử dụng số định lượng không tham số không tham lam, .*?, để khớp không quá một nhận xét.

Tuy nhiên, cụm từ thông dụng phức tạp hơn bạn cung cấp thậm chí còn phức tạp hơn thế. Dựa trên câu trả lời của nikc.org, tôi tin rằng đó là để thực thi hạn chế rằng “bình luận có thể không được lồng nhau”; nghĩa là, chúng không được chứa /* bên trong chúng. Trong các ngôn ngữ khác cho phép nhận xét /* like /* this */ (nghĩa là, nội bộ/* không bị cấm và cũng không phải là nhận xét lồng nhau), mẫu \/\*.*?\*\/ sẽ phù hợp để khớp với chúng.

15

Mã bởi lời giải thích mã thông báo:

\/ <- an escaped '/', matches '/' 
\* <- an escaped '*', matches '*' 
[^*]* <- a negated character class with quantifier, matches anything but '*' zero or more times 
\*+ <- an escaped '*' with quantifier, matches '*' once or more 
( <- beginning of group 
[^/*] <- negated character class, matches anything but '/' or '*' once 
[^*]* <- negated character class with quantifier, matches anything but '*' zero or more times 
\*+ <- escaped '*' with quantifier, matches '*' once or more 
)* <- end of group with quantifier, matches group zero or more times 
\/ <- an escaped '/', matches '/' 

Regex Reference

Analysis on Regexper.com

+1

yêu thích việc chia nhỏ ý nghĩa của từng phần, bạn sẽ không nhận được điều này thường xuyên – peroija

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