正则表达式:使用与特定单词

时间:2016-05-22 12:51:59

标签: c regex regex-lookarounds

我正在重构一个非常大的C项目,我需要找出特定程序员编写的代码的一部分。 幸运的是,参与此项目的每个人都使用他在标准C风格评论中的电子邮件地址来标记自己的代码。

好的,有人可以说这可以通过命令行中的grep轻松实现,但这不是我的目标:我可能需要删除此注释或用其他文本替换它们,因此正则表达式是唯一的解决方案。

实施例

/*********************************************
 *
 * ... some text ....
 *
 * author: user@domain.com
 *
 *********************************************/

this post我找到了正确的表达式来搜索C风格的评论:

\/\*(\*(?!\/)|[^*])*\*\/

但这还不够!我只需要包含特定电子邮件地址的评论。幸运的是,我正在寻找的电子邮件地址域似乎在整个项目中是独一无二的,所以这可以使它更简单。

我想我必须使用一些积极的先行断言,我已经尝试过这个:

(\/\*)(\*(?!\/)|[^*](?=.*domain.com))*(\*\/)

但它没有运行! 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用

\/\*[^*]*(?:\*(?!\/)[^*]*)*@domain\.com[^*]*(?:\*(?!\/)[^*]*)*\*\/

请参阅regex demo

模式详情

  • /\* - 评论开始
  • [^*]*(?:\*(?!\/)[^*]*)* - 除了*/
  • 之外的所有内容
  • @domain\.com - 文字domain.com
  • [^*]*(?:\*(?!\/)[^*]*)* - 除了*/
  • 之外的所有内容
  • \*\/ - 评论结束

更快的替代方案(因为第一部分将查找除评论结尾单词@domain之外的所有内容):

\/\*[^*@]*(?:\*(?!\/)[^*@]*|@(?!domain\.com)[^*@]*)*@domain\.com[^*]*(?:\*(?!\/)[^*]*)*\*\/

请参阅another demo

在这些模式中,我使用(\*(?!\/)|[^*])*展开的构造:[^*]*(?:\*(?!\/)[^*]*)*Unrolling有助于构建更有效的模式。