我正在重构一个非常大的C项目,我需要找出特定程序员编写的代码的一部分。 幸运的是,参与此项目的每个人都使用他在标准C风格评论中的电子邮件地址来标记自己的代码。
好的,有人可以说这可以通过命令行中的grep轻松实现,但这不是我的目标:我可能需要删除此注释或用其他文本替换它们,因此正则表达式是唯一的解决方案。
实施例
/*********************************************
*
* ... some text ....
*
* author: user@domain.com
*
*********************************************/
从this post我找到了正确的表达式来搜索C风格的评论:
\/\*(\*(?!\/)|[^*])*\*\/
但这还不够!我只需要包含特定电子邮件地址的评论。幸运的是,我正在寻找的电子邮件地址域似乎在整个项目中是独一无二的,所以这可以使它更简单。
我想我必须使用一些积极的先行断言,我已经尝试过这个:
(\/\*)(\*(?!\/)|[^*](?=.*domain.com))*(\*\/)
但它没有运行! 有什么建议吗?
答案 0 :(得分:0)
您可以使用
\/\*[^*]*(?:\*(?!\/)[^*]*)*@domain\.com[^*]*(?:\*(?!\/)[^*]*)*\*\/
请参阅regex demo
模式详情:
/\*
- 评论开始[^*]*(?:\*(?!\/)[^*]*)*
- 除了*/
@domain\.com
- 文字domain.com
[^*]*(?:\*(?!\/)[^*]*)*
- 除了*/
\*\/
- 评论结束更快的替代方案(因为第一部分将查找除评论结尾和单词@domain
之外的所有内容):
\/\*[^*@]*(?:\*(?!\/)[^*@]*|@(?!domain\.com)[^*@]*)*@domain\.com[^*]*(?:\*(?!\/)[^*]*)*\*\/
请参阅another demo
在这些模式中,我使用(\*(?!\/)|[^*])*
展开的构造:[^*]*(?:\*(?!\/)[^*]*)*
。 Unrolling有助于构建更有效的模式。