正则表达式:在两个字符串之间提取与特定单词匹配的文本

regex: extract text between two string with text that match a specific word

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

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

例如

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

this post 我找到了搜索 C 风格注释的正确表达式:

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

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

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

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

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

你可以使用

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

regex demo

图案详情:

  • /\* - 评论开始
  • [^*]*(?:\*(?!\/)[^*]*)* - 除了 */
  • @domain\.com - 文字 domain.com
  • [^*]*(?:\*(?!\/)[^*]*)* - 除了 */
  • \*\/ - 评论结束

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

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

another demo

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