正则表达式匹配这种方法签名

时间:2017-08-31 09:27:33

标签: regex python-3.x

我想要解析这种方法签名:

.method [list of words than can or cant appear] MethodName([List of params])ReturnType

这里举例说明我需要解析的2个方法签名:

.method Paracasa(Ljava/lang/String;I)V
.method public static OnDone()V

主要问题是.method和MethodName之间出现的单词是否存在,如果存在,我需要捕获它们。我有一个解决方案,但我确信会有一个更清洁的解决方案,我想知道。我的解决方案是

\.method(?:\s+(.*)\s+|\s+)(.+)\((.*)\)\s*(.*)

正如您所看到的,我添加了两个选项,我的意思是,如果出现.method和Methodname之间的这组词,或者它不是。但对我来说似乎很脏。

可以换一种方式吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

\.method\s+(.*?)\s*(\w+)\((.*)\)(\w+)

与你的正则表达式非常相似。

\.method\s+
(.*?)  # non-greedy match, matches only extra keywords like public etc.
\s*    # so the previous non-greedy match won't match trailing space
(\w+)  # I suppose method names can only be alphanumeric or underscore
\((.*)\)  # May cause problems if list of params include another parentheses - is no longer "regular" language
(\w+)  # Same as with method name, only alphanumeric or underscore?

我最关心的是参数列表中的括号,因为它会使这个问题不适合正则表达式(虽然可能有一些扩展)。

此外,如果您希望更严格地解析方法名称和返回类型,则可以在([A-Za-z_][A-Za-z_0-9]*)上使用(\w+)。据我所知,这是大多数语言中标识符名称的常用正则表达式。