Perl正则表达式使用未注释的代码查找行

时间:2014-05-08 07:15:16

标签: regex perl

考虑以下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行?

2 个答案:

答案 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的建议下更加清晰。