使用正则表达式匹配特定方法的javadoc注释(python)

1 投票
2 回答
505 浏览
提问于 2025-04-18 12:50

我在写一个正则表达式(regex)的时候遇到了一些麻烦,想要匹配特定Java方法的javadoc注释内容。举个例子:

/**
 * Do not match this.
 */

/**
 * Do match this.
 */
@SomeAnnotation
public boolean methodX() { }
/**
 * Do not match this.
 */

我已经知道了这个方法的签名,所以可以在正则表达式中用到它。

我可以用以下方式匹配所有的javadoc注释:

/\*\*(.*?)\*/

我还指定了re.DOTALL选项。我尝试扩展正则表达式,使用负向前瞻(negative lookahead),也就是我只想要紧接着这个方法的javadoc注释:

/\*\*(.*?)\*/(?!.*?/\*\*.*?public boolean methodX\(\))

但是这样导致(.*?)匹配的内容从第一个javadoc注释的开始一直到紧接着methodX的javadoc注释的结束。

我一直在尝试各种构造正向和负向前瞻的方法,但都没有成功。我到底漏掉了什么呢?

2 个回答

1

你的表达式是贪婪的,它现在正在匹配第一个注释中的 */(因为 .* 可以匹配到 */)。试试使用

/\*\*((?:[^*]+|\*[^/])*)\*/

这样可以确保你不会意外地匹配到结束的 */,从而导致同时匹配到两个注释。

编辑:
这段代码避免了包含 */ 的注释问题。我也不太清楚为什么会有这样的情况,但我还是写了:

/\*\*((?:(?!\*/).)*)\*/(?:(?!/\*\*).)*(?=public boolean methodX)

可以看看这个例子来确认它的有效性:http://regex101.com/r/yV9oK2/2。我从最初的匹配方式切换到了负向前瞻,以避免程序测试时出现的“灾难性回溯” :)

2

这段内容是关于如何匹配在函数前面的注释部分(从 /***/)的,注释被放在一个叫 comment 的组里:

(?P<comment>/\*\*(?:(?!/\*\*).)*?\*/)(?:(?:(?!\*/).)*?)(?=public boolean methodX)

你可以在 regex101.com 上查看一个测试。

  • 这里的关键是要忽略想要的文本中的额外 /***/,使用 (?!/\*\*).)*?(?!\*/).)*? 来实现。

  • ?: 是用来从结果中剔除那些不重要的部分。

撰写回答