正则表达式查找具有“内部”方法的方法

问题描述 投票:0回答:1

我正在对一个整体的java代码库进行一些维护,其中发现一些@GET方法实际上会启动一个写入会话,因此实际上应该是@POST方法。我编写了以下正则表达式来帮助我的搜索:

@GET[^}]+startWrite

这给了我在到达“}”之前到达字符串“startWrite”(它是启动写入会话的方法名称的一部分)的所有出现的@GET注释,“}”用于关闭java中的方法。这个解决方案并不完美,因为在写入会话开始之前(例如在 if 语句中),可能会在方法内部使用 },但事实证明它足够有效。

但是,后来我注意到很多方法都遵循这种格式:

@GET
@Path("/methodName")
public ObjectName methodName(...){
    ...
    return methodNameInner(...);
}
private methodNameInner(...){
    startWriteSession();
    ...
}

换句话说,写入会话命令被移动到另一个方法,该方法始终具有与原始方法(和路径名)相同的名称,后跟“Inner”。这个内部方法总是低于原始方法。我尝试编写一个正则表达式来搜索 @GET 的出现,后跟一些字符串,直到路径名或方法名(我将其隔离在一个单独的组中),然后是更多字符,然后是 Inner,然后是相同的 [^}]+startWrite,意味着内部方法在到达方法末尾之前到达“startWrite”字符串。但我无法让它工作。

有人可以帮助我吗?

java regex regex-group
1个回答
0
投票

个人想法

我完全同意对你的问题的评论,一个常规的 表达式不是正确的工具,因为它无法处理您的所有 情况下,并且仅当您正在分析的代码编写如下时才有效 你预料到了。

但在某些情况下,您只想纠正/适应一些 现有代码,仅限于几个文件和方法,那么正则表达式可以 快速解决您的需求。

正则表达式,无保证

当且仅当您的代码像您提到的那样编写时,那么您 可以尝试一下这个评论模式:

"
^@GET\r?\n                     # A line with @GET
@Path\(\"(?<path>[^\"]*)\"\)   # Followed by @Path, and capture this path.
.*?                            # Match anything, in an ungreedy way.
# Capture the name of the method and its parameters.
public\s+ObjectName\s+(?<method>\w+)\((?<params>[^)]+)\)\s*\{
.*?                            # Match anything, in an ungreedy way.
\bstartWriteSession\(\);       # match a call to startWriteSession().
"gmxsi

在线小测试:https://regex101.com/r/4Jpg1B/2

© www.soinside.com 2019 - 2024. All rights reserved.