2016-08-26 175 views
-1

我需要找到一个链通话功能发生查找函数的参数逗号,但必须包括哪里有不止一个参数传递的(以Java编程)的情况下:使用正则表达式

Tower.getType(I,J).initialPrice(F,G);

Tower.getType()。initialPrice();

到目前为止,只有设法使正则表达式时,只有一个参数或没有一个:[]

[\ w] +(+ [\ w] + [(] + [\ w ] * + [)]){2,} + [;]

喜欢:

Tower.getType()initialPrice(); ();函数3()。函数3()。函数4()。函数5();函数3()函数3。

我想这一点,但它不工作:

[\ w] +([\。] + [\ w] + [(] + [\ w] * +([\] + [\ W])* + [)]){2,} + [;]

我的代码:

public static void checksMessageChain (String s) {   
if (s!=null && s.matches("[\\w]+([\\.]+[\\w]+[(]+[\\w]*+[)]){2,}+[;]")) { 
    System.out.println("\nIts Message Chain for "+s+"\n"); 
    splitMessageChain(s); // {0,} equivale a * 
} else if (s!=null && s.matches("[\\w] + ([\\.] + [\\w] + [(] + [\\w]* + ([\\,] + [\\w])* + [)]) {2,} + [;]")) { 
    System.out.println("\nIts Message Chain for "+s+"\n"); 
    splitMessageChain(s); 
} else { 
    System.out.println("\nIts not Message Chain for "+s+"\n"); 
} } 
+0

你可以给一些示例输入/输出吗? – suiwenfeng

+2

你有一个问题,所以决定使用正则表达式 - 现在你有两个问题... – Alnitak

回答

0

我不会与指定参数麻烦,只是使用:

\\w+(?:\\.\\w+\\([^)]*\\)){2,}; 

请注意,如果一个String参数包含右括号并且它不处理多行表达式,则这将失败。
对于这样一种复杂的语言,通常情况下,你最好使用专门的解析器。我从来没有使用过,但快速搜索显示在Github上有javaparser

你可以试试regex101

+0

我使用AST解析器,但在此之后,我需要检查函数的消息链或不... ...和regex101它非常有用!谢谢! –

+0

等等,你需要至少两个方法调用链接,对不对?我忘了考虑这一点,我已经更新了我的正则表达式和regex101测试。不客气! – Aaron

+0

感谢您的帮助! (: –

0

不要试图使用正则表达式来做到这一点:你会头痛,一个程序不会涵盖所有可能的情况。

只需使用JavaParser:它是开源的,它是轻量级的,它没有依赖关系。

您可以解析整个Java文件,然后导航抽象语法树来查找函数调用,也可以直接解析您感兴趣的单个表达式,如果您已经确定了那段源代码。

在你要调用parse第一种情况,否则parseExpression

一旦你的MethodCallExpr如果其父是另一个MethodCallExpr那么你已经链式调用。

声明:我是JavaParser的贡献者