2017-08-31 68 views
-1

我有这种方法的签名我想分析:正则表达式匹配这种方法签名

.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*(.*) 

正如你可以看到我已经添加了两个选择,我的意思是,如果出现这个群体。方法和方法名之间的话也没有。但对我来说似乎很肮脏。

难道可以通过另一种方式吗?

在此先感谢。

+0

我们在这里讨论的是java方法的名字,所以你想要匹配像public,private,protected,static等关键字? –

+0

嗯,没有。你是对的这来自一个java源代码,但这是smali,在[可能或不能出现的单词列表]我已经看到与java关键字不匹配的东西(现在不能重新注册)。所以这就是为什么我想要捕捉这部分中的所有文本以保证安全。 – Notbad

回答

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+)。就我所知,这是大多数语言中标识符名称的常用正则表达式。

+0

为什么说“我最关心的是参数列表中的圆括号,因为它会使这个问题不适合正则表达式”?你的意思是,捕获未知数量的参数吗? – Notbad

+1

@Notbad我没有意识到它是方法声明(不是方法调用),所以参数列表中的另一个括号可能无效。我的意思是括号内的另一个括号,这会对我和你的正则表达式造成麻烦。 –