Từ perlfaq6 "Làm thế nào để sử dụng một biểu thức chính quy để dải comments C phong cách từ một tập tin?":
Trong khi điều này thực sự có thể được thực hiện, nó khó hơn nhiều so với bạn nghĩ. Ví dụ: một lớp lót này
perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
sẽ hoạt động trong nhiều trường hợp nhưng không phải tất cả các trường hợp. Bạn thấy đấy, nó quá đơn giản, có đầu óc đối với một số loại chương trình C, đặc biệt là những chương trình có vẻ như là những nhận xét trong các chuỗi được trích dẫn. Vì điều đó, bạn cần một cái gì đó như thế này, được tạo ra bởi Jeffrey Friedl và sau đó được sửa đổi bởi Fred Curtis.
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
print;
Tất nhiên, điều này có thể được viết rõ ràng hơn với bộ sửa đổi/x, thêm khoảng trắng và nhận xét. Ở đây nó được mở rộng, lịch sự của Fred Curtis.
s{
/\* ## Start of /* ... */ comment
[^*]*\*+ ## Non-* followed by 1-or-more *'s
(
[^/*][^*]*\*+
)* ## 0-or-more things which don't start with/
## but do end with '*'
/ ## End of /* ... */ comment
| ## OR various things which aren't comments:
(
" ## Start of " ... " string
(
\\. ## Escaped char
| ## OR
[^"\\] ## Non "\
)*
" ## End of " ... " string
| ## OR
' ## Start of ' ... ' string
(
\\. ## Escaped char
| ## OR
[^'\\] ## Non '\
)*
' ## End of ' ... ' string
| ## OR
. ## Anything other char
[^/"'\\]* ## Chars which doesn't start a comment, string or escape
)
}{defined $2 ? $2 : ""}gxse;
Một sửa đổi chút ít cũng loại bỏ C++ bình luận, có thể kéo dài nhiều dòng sử dụng một nhân vật tiếp tục:
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?\n|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;
Nguồn
2009-05-26 16:30:33
Theo quy tắc chung, tôi thấy rằng khi bạn đang cố gắng thao tác một ngôn ngữ lập trình như C, XML, SQL, v.v ... bạn thực sự nên nghĩ đến một trình phân tích cú pháp chứ không phải regex. Tôi rất khuyên bạn nên tìm hiểu về máy phát điện phân tích cú pháp, yacc, javacc, v.v. Nó đã có những phần thưởng lớn đối với tôi như một nhà phát triển phần mềm. – zimbu668