使用正则表达式匹配特定方法的javadoc注释(python)
我在写一个正则表达式(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 上查看一个测试。
这里的关键是要忽略想要的文本中的额外
/**
和*/
,使用(?!/\*\*).)*?
和(?!\*/).)*?
来实现。?:
是用来从结果中剔除那些不重要的部分。