/ *和* /的字符串匹配

时间:2009-12-16 02:43:03

标签: regex perl

我有一个文本文件,包括以下几行:

/* MY TXT File LINE */
/* MY TXT File LINE MORE */

constant private FileName = <A "C:\\TMP\\ALARM.TXT">

constant ConfigAlarms = <U1 0>    /*  Comment Here*/

我不知道如何划分注释行(/* something */):

LINE1:

/* MY TXT File */

LINE2 :(实际上,我认为该行不是真正的评论行。)

constant ConfigAlarms = <U1 0>    /*  Comment Here*/

我的代码如下。

if ($val =~ /\/\*/){
    print "<!-- $line -->";
    print "\n";
}

LINE1和LINE2将被视为评论。

我用Google搜索并找到了以下信息。

^f     # f at the beginning of a line
^ftp   # ftp at the beginning of a line
e$     # e at the end of a line
tle$   # tle at the end of a line

但我不知道如何将/*^$字符组合以改进我的代码以解析以/*开头并以{结尾的行{1}}

谢谢。

3 个答案:

答案 0 :(得分:4)

m{^/\*.*\*/$}

会将/*作为前两个字符,*/作为最后两个字符的行匹配。

答案 1 :(得分:2)

FAQ。不要忽略匹配给定模式的文本,而是捕获它。

或者,你可以给String::Comments::Extract一个镜头。见[String::Comments::Extract::C->collect( <source> )](http://search.cpan.org/perldoc/String::Comments::Extract#String::Comments::Extract::C-%3Ecollect(%3Csource%3E)

答案 2 :(得分:2)

有一个令人难以置信的CPAN模块可以帮助解决这个问题Regexp::Common::comment。使用它非常容易:

use Regexp::Common qw /comment/;

while (<>) {
    /$RE{comment}{C}/       and  print "Contains a C comment\n";
    /$RE{comment}{C++}/     and  print "Contains a C++ comment\n";
    /$RE{comment}{PHP}/     and  print "Contains a PHP comment\n";
    /$RE{comment}{Java}/    and  print "Contains a Java comment\n";
    /$RE{comment}{Perl}/    and  print "Contains a Perl comment\n";
    /$RE{comment}{awk}/     and  print "Contains an awk comment\n";
    /$RE{comment}{HTML}/    and  print "Contains an HTML comment\n";
}

use Regexp::Common qw /comment RE_comment_HTML/;

while (<>) {
    $_ =~ RE_comment_HTML() and  print "Contains an HTML comment\n";
}

您应该能够轻松扩展此内容以涵盖多行注释。