From perlfaq6"Как использовать регулярное выражение для удаления комментариев в стиле C из файла?":
Хотя это на самом деле можно сделать, это гораздо сложнее, чем вы думаете. Например, этот однострочный
perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
будет работать во многих, но не во всех случаях. Видите ли, он слишком прост для некоторых видов программ на C, в частности, для тех, которые выглядят как комментарии в строках в кавычках. Для этого вам понадобится что-то вроде этого, созданное Джеффри Фридлом и позднее измененное Фредом Кертисом.
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
print;
Конечно, это может быть написано более четко с помощью модификатора / x, с добавлением пробелов и комментариев. Здесь это расширено, любезно предоставлено Фредом Кертисом.
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;
Небольшая модификация также удаляет комментарии C ++, возможно, занимая несколько строк, используя символ продолжения:
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?\n|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;