我正在对一个整体的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”字符串。但我无法让它工作。
有人可以帮助我吗?
我完全同意对你的问题的评论,一个常规的 表达式不是正确的工具,因为它无法处理您的所有 情况下,并且仅当您正在分析的代码编写如下时才有效 你预料到了。
但在某些情况下,您只想纠正/适应一些 现有代码,仅限于几个文件和方法,那么正则表达式可以 快速解决您的需求。
当且仅当您的代码像您提到的那样编写时,那么您 可以尝试一下这个评论模式:
"
^@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