注释 /* */的正则表达式,谢谢

注释 /* */的正则表达式,谢谢

我写了一个\/\*.*?\*\/   (懒惰匹配)
但是如果/*    */中有换行就不行了,
例:
   /* first
    *second
    */
不能识别
所以我改成了
\/\*(\n|.)*?\*\/,但就成了贪心匹配了

  /*first
   *second
   */
  
  /*ksdf*/
这两个注释匹配成为一个了

请问可以怎么解决呢?

谢谢!
还想问一下,*?前面只能是. 不能是 (\n|.)吗
try

[Copy to clipboard] [ - ]
CODE:
\/\*.*?\*\/ s



QUOTE:
在/s模式中,.也匹配/n



QUOTE:
原帖由 heixia108 于 2008-3-10 19:17 发表
我写了一个\/\*.*?\*\/   (懒惰匹配)
但是如果/*    */中有换行就不行了,
例:
   /* first
    *second
    */
不能识别
所以我改成了
\/\*(\n|.)*?\*\/,但就成了贪心匹配了

  /*first
   * ...

你的第二种方法是可以的

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
undef $/;
open my $file,"<","data" or die "Fail to open data $!";
while(<$file>){
     print "$1\n" if /\/\*((\n|.)*?)\*\//;
     }



QUOTE:
<lig@other-server:~/chinaunix>$ cat data
/* first
*second
*/

/*ksdf*/



QUOTE:
<lig@other-server:~/chinaunix>$ ./enhance
first
*second

俺不知道你是怎么测试的
我是用在lex中的
\/\*.*?\*\/ s
好像不行
count.l

[Copy to clipboard] [ - ]
CODE:
       
      int        num_comment = 0;

%%
\/\*.*?\*\/                ++num_comment;
%%

main()
{
        yylex();
        printf("本文件的注释数目为: %d\n",num_comment);
}

int yywrap()
{
        return 1;
}

测试文件

[Copy to clipboard] [ - ]
CODE:
#include <stdio.h>

/*This is just a test.*/
/*hava a problem*/
int main()
{
        printf("Hello,world\n");
/*This is the third
* comment*/
        return 0;
}

lex俺不懂
不过正则表达式在不同的语言中也有差异的
比如sed 捕获就要用\(\)
所以你还是看lex关于regex的帮助文档吧
对于第二种方法我的测试结果

[heixia@localhost program]$ flex count.l
[heixia@localhost program]$ gcc -o t lex.yy.c
[heixia@localhost program]$ ./t<test_notation.c
#include <stdio.h>


        return 0;
}
本文件的注释数目为: 1


第一种方法的为
[heixia@localhost program]$ flex count.l
[heixia@localhost program]$ gcc -o t lex.yy.c
[heixia@localhost program]$ ./t<test_notation.c
#include <stdio.h>



int main()
{
        printf("Hello,world\n");
/*This is the third
* comment*/
        return 0;
}
本文件的注释数目为: 2
谢谢了
我用其它程序测了一下,第二个是对的~应该是因为lex中的语法问题导致的
try this ?

QUOTE:
H:\test>type comments.pl
use strict;
use warnings;

undef $/;
my $count;
my $contect=<DATA>;
while($contect =~ m/(?<=\/\*).*?(?=\*\/)/gs){
    print "Comment ",++$count," --> [$&]\n";
}

__DATA__
hello,world

the next line is a commnets;
/* hello,perlers
    welcome to ChinaUnix
    */

  /* the second comment
  perl's regular expression is very powerfull
  what a wonderful things*/

  ok
  /* Let's go */

H:\test>comments.pl
Comment 1 --> [ hello,perlers
    welcome to ChinaUnix
    ]
Comment 2 --> [ the second comment
  perl's regular expression is very powerfull
  what a wonderful things]
Comment 3 --> [ Let's go ]

H:\test>