Eclipse中用于匹配“非javadoc”注释的正则表达式

10

我正在尝试编写一个正则表达式,以匹配以下格式的(非 javadoc) 注释:

/*
 * (non-javadoc)
 *
 * some other comment here
 *
 */

目前我使用的是(?s)/\*\R.*?non-Javadoc.*?\*/,但它实际上匹配了太多内容。我的文件顶部有一个标题,类似于:

/*
 * header text
 */
 public class MyClass {

 }

它与文件顶部的 /* 匹配,但我真正想匹配的是生成的 (非javadoc) 注释。 有人能帮我修复这个正则表达式吗?

编辑:我正在尝试使用 Eclipse 的查找/替换对话框,但如有需要我也可以使用外部工具。


不知道是哪种语言,但可能是PHP,在这种情况下,请使用Tokenizer。 - KingCrunch
@KingCrunch,它正在使用Eclipse的查找/替换功能。 - Jeff Storey
对于这个问题,我也在Eclipse中寻找那些没有任何有用信息的丑陋代码垃圾... :( - Tom Fink
2个回答

11
这应该可以解决问题:
(?s)/\*[^*](?:(?!\*/).)*\(non-javadoc\)(?:(?!\*/).)*\*/
/\*[^*]匹配C风格注释(/* */)的开头,但不匹配JavaDoc注释(/** */)的开头。

(?!\*/).匹配除了*/序列开头的任何单个字符。使用(?:(?!\*/).)*进行搜索,而不是.*?可以使匹配无法从一个注释开始并结束在另一个注释中。

更新:针对Jacek的评论(迟到的回应):是的,您可能需要在正则表达式的末尾添加一些内容,以便将其替换为空字符串,并且不会在代码中留下许多空行。但是Jacek的解决方案比实际需要更加复杂。您只需要添加\s*即可。

\R转义序列匹配许多种换行符,包括Unicode行分隔符(\u2028)和段落分隔符(\u2029)以及DOS/网络回车+换行符序列(\r\n)。但这些都是空白字符,因此\s可以匹配它们(Eclipse中,至少如此;根据文档,它等效于[\t\n\f\r\p{Z}])。

Jacek添加的\s*仅意味着匹配可能存在的任何水平空格(空格或制表符)之前的换行符,以及其后面的缩进。(您必须将其删除,因为您不会删除第一个注释行之前的缩进。)但事实证明\s*可以完成整个工作:

(?s)/\*[^*](?:(?!\*/).)*\(non-javadoc\)(?:(?!\*/).)*\*/\s*

5
在上述正则表达式末尾添加(\s*)\R(\s*)可以包括以下换行和缩进字符。否则,用空字符串进行替换会在每个注释的位置留下一个空行。 - Jacek Kołodziejczyk
有人对此感到强烈,将Jacek的添加编辑进了我的正则表达式中。感谢拒绝该修改的审阅者们,也感谢@Tom将这个不完整的答案带回到我的视线中。 - Alan Moore

0
在 Perl 中,它看起来会像这样。
/
   \/\*
   (?: (?! \*\/ ) . )*
   non-javadoc
   (?: (?! \*\/ ) . )*
   \*\/
/sx

我应该指明它是使用 Eclipse 的查找/替换功能。 - Jeff Storey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接