考虑以下C / C ++代码行
/* Comment header int a = 10; Comment footer */
/* Comment header */ /* Comment footer */
/* Comment header */ int a = 10; /* Comment footer */
我尝试了以下内容,但它不适用于第3行
$line =~ /^\s*\/\*.*\*\/\s*$/
第1行和第2行只有注释而不是代码。如何才能使正则表达式仅适用于第3行?
答案 0 :(得分:3)
问题"How do I use a regular expression to strip C-style comments from a file?" is answered in the perl faqs。这是正则表达式的好评(ish)注释版本:
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;
您可以直接使用该正则表达式并将之前的字符串与字符串进行比较 之后,看看是否剩下除空格以外的任何内容。
答案 1 :(得分:0)
一个非常基本的解决方案是:
perl -ne 'm{/\*(.*?)\*/.*\S+.*/\*(.*?)\*/} && print $_' <input file>
中间的匹配是非常基本的,匹配任何至少有一个非空白字符的东西,但它只从输入中得到第三行。
编辑:在mtm的建议下更加清晰。