【发布时间】:2012-06-18 12:56:47
【问题描述】:
我的任务是(尝试)在大型代码库中搜索和替换单词后缀,仅当它出现在 cmets 中时。所有的 cmets 都是 /* 或 // 类型,但它们保证包括大多数可以想象的边缘情况。
所以我想改变这个:
/* blah blah something__suffix blah */
到这里:
/* blah blah something blah */
但我也想改变这个:
// blah blah something__suffix blah
到这里:
// blah blah something blah
还有这个:
/*
* blah blah something__suffix blah
*/
到这里:
/*
* blah blah something blah
*/
还有这个:
/**
// blah blah something__suffix blah
*/
到这里:
/**
// blah blah something blah
*/
令人作呕(字面意思)。
最初我觉得这是一个解析器任务,我安装了 cochinelle,它确实可以解析我的 cmets,但它被我的预处理器宏卡住了,对于那些只将其作为一次性任务的人来说,解决方法似乎很复杂。所以现在我正在考虑正则表达式。
我没有找到很多关于在 C 和 C++ cmets 中使用正则表达式进行真正强大的搜索和替换的建议(除了“你需要一个解析器”),但我确实注意到似乎有一条很好的道路- 在 perl FAQ 上测试了 perl 脚本,用于删除这两种样式的 cmets here。
如下:
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?\n|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;
print;
我的问题:如何修改此脚本,以便可以搜索已识别为评论的文本以查找后缀并删除后缀,而不是剥离评论,从而使评论的其余部分保持不变?
【问题讨论】:
-
注意@daxim 的链接,那里接受的答案似乎不能处理字符串。所以这个表达式可能更健壮。
-
那个
Regexp::Common真的很棒,不知道。谢谢达西姆。 -
@Qtax 你能举一个它不处理的字符串的例子吗?
-
@Halle,
x = "hello there /* oops this is not a comment */";。字符串中的“comment”将被匹配。虽然这个表达式能正确处理字符串。