正则表达式匹配Java方法签名

时间:2010-06-09 15:12:22

标签: java regex string parsing

我有这个特殊要求,其中必须通过不同组件的不同正则表达式来识别方法。例如,返回参数需要有一个正则表达式,一个用于方法名称,一个用于参数类型,一个用于参数名称。我能够想出一个表达式,直到这一步如下 -

([^,]+) ([^,]+)\((([^,]+) ([^,]+))\)

适用于像

这样的方法签名
  

ReturnType foo(Arg参数)   正则表达式分别标识ReturnType,foo,Arg和参数。

现在问题是一个方法可以没有/一个/多个参数用逗号分隔。我无法为此重复表达。将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果您选择使用正则表达式/字符串操作,则可以拉出整个参数字符串,将其拆分为逗号并将结果字符串拆分为空格。

虽然我同意JaredPar对你的问题的评论,但至少如果你希望能够处理java api中有效的所有可能性。

例如,有一系列关键字可以为您的方法添加前缀(公共/私有,静态,最终)。还可以对方法或参数进行注释。像在返回值而不是空格之间使用制表符或换行符这样简单的操作会破坏当前的正则表达式。

祝你好运

答案 1 :(得分:1)

让我们抽象一下,并说我们想匹配一个(可能是空的)用逗号分隔的数字列表。

(empty)
12
12,34
12,34,56

因此该模式

^$|^\d+(,\d+)*$

现在您可以尝试更换组件以符合您的要求:

  • 而不是\d+,而是用于匹配类型名称和标识符的正则表达式
  • 也许允许\s*围绕逗号
  • 也许你甚至会添加特殊的varargs最后一个参数(也可以是第一个也是唯一一个)

请注意,如果您允许泛型类型参数,那么您绝对不能使用正则表达式,因为您可以嵌套<...>并且任意深度的平衡平衡括号的语言不常规。

虽然你可以说在实践中,没有人会比3级更深入地嵌入类型参数,所以它再次成为常规。

那就是说,一个合适的解析器真的是最好的工具。只需在ANTLR中查找Java语法的实现。


另见