我有这个特殊的要求,其中必须通过不同组件的不同正则表达式来标识方法。例如,需要有一个用于返回参数的正则表达式,一个用于方法名称的正则表达式,一个用于参数类型的正则表达式,一个用于参数名称的正则表达式。直到这一步我才能够想出一个表达式,如下 -
([^,]+) ([^,]+)\((([^,]+) ([^,]+))\)
它非常适合像 - 这样的方法签名
ReturnType foo(Arg parameter) The regular expression identifies ReturnType, foo, Arg and parameter separately.
现在的问题是,一个方法可以没有/一个/多个参数,并用逗号分隔。我无法为此得到重复的表达。我们将不胜感激。
最佳答案
让我们稍微抽象一下,假设我们要匹配一个(可能是空的)以逗号分隔的数字列表。
(empty)
12
12,34
12,34,56
因此该模式是
^$|^\d+(,\d+)*$
现在您可以尝试替换组件以匹配您想要的内容:
- 而不是
\d+
,无论您使用什么正则表达式来匹配类型名称和标识符 - 也许允许
\s*
逗号周围 - 也许您甚至可以添加特殊的可变参数最后一个参数(也可以是第一个也是唯一一个)
请注意,如果您允许泛型类型参数,那么您绝对不能使用正则表达式,因为您可以嵌套 <...>
并且任意深度的平衡括号的语言是不规则的。
尽管您可能会说,在实践中,没有人会将类型参数嵌套得更深,例如 3 层,因此它再次变得常规。
也就是说,一个合适的解析器确实是最好的工具。只需在 ANTLR 中查找 Java 语法的实现即可。
<小时/>另请参阅
关于java - 用于匹配 Java 方法签名的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007139/