正则表达式:匹配所有期望给定的表达式(不是char)?

时间:2011-10-13 20:08:21

标签: regex sed

我正在使用SED删除C风格的评论。

这是我正在使用的命令:

sed s:[/] [*]。* [*] [/] :: g

有两种我无法弄清楚的案例:

首先:

int x /* comment */ = 1; /* comment */ 

输出:     int x

第二:多行评论

/* first line 
   second line */

输出:

/* first line
   second line */

第一个问题是。*在中间,因为模式匹配是贪婪的,一旦第一个“/ ”匹配[/] [*],内部注释表达式匹配。和结束注释表达式匹配[*] [/]。

的结尾

现在第二个问题是“。”与新行字符不匹配,但如果我添加一个新行字符,则会发生以下情况。

输入:

int x;
/* comment */
x = 1;
/* comment */

输出:

int x;

有些人可以告诉我如何使关闭标签不被。*或[\ s \ S] *消费吗?

3 个答案:

答案 0 :(得分:1)

您可以使用python执行此操作,请参阅此处:http://www.saltycrane.com/blog/2007/11/remove-c-comments-python/

实际上您也可以使用sed执行此操作,但是,请参阅此处:http://sed.sourceforge.net/grabbag/scripts/remccoms3.sed

以下是一些perl解决方案:http://perldoc.perl.org/perlfaq6.html#How-do-I-use-a-regular-expression-to-strip-C-style-comments-from-a-file%3f

HTH

答案 1 :(得分:1)

这是我能提出的一个正则表达式:\/\*(.*?)\*\/

输入:

`int x /* comment */ = 1; /* comment */ 
/* first line 
   second line */
int x;
/* comment */
x = 1;
/* comment */`

输出是:

$matches Array:
(

    [0] => Array
        (
            [0] => /* comment */
            [1] => /* comment */
            [2] => /* first line second line */
            [3] => /* comment */
            [4] => /* comment */
        )

    [1] => Array
        (
            [0] =>  comment 
            [1] =>  comment 
            [2] =>  first line second line 
            [3] =>  comment 
            [4] =>  comment 
        )

)

答案 2 :(得分:0)

AWK:

awk -F"\033" -v RS="\034" '{gsub("\*\/","\034");gsub(/\/\*[^\034]*\034/,"");print}' input.c