有时候以一些功能需求是找出java文件中,方法名为xxx的方法所在的文件。或则说是扫描java文件,找出每个java文件中包含的java函数。把这些函数管理起来,便于以后维护。
比较笨拙的方法就是用正则表达式去找。下面给出java函数签名的正则表达式:
(public|private|protected)?\s{0,}([\w<>,\[\]]+)?\s{0,}([a-z][\w]+)\s?\(([A-Z][\w\[\]<,>]+\s+[\w]+\s?,?\s?){0,}\)\s?([\w]{6,}\s?[\w]{9})?\s{0,}\{\s?
//匹配案例:
public List<Map<String,String>> findCalled(String name,List<Map<String,String>> list) throws Exception {
上面给出的正则表达式可以匹配如上的函数签名,当然可以匹配绝大多数的函数签名。除非你写的函数特别特别另类,比如说在结尾的画括号{后面有n多个空格,那么久匹配失败了,因为{后的匹配是s?,即可能有一个空格或则没有。那么你硬是要搞很多空格可以换成s{0,}。
如果需要用到匹配if,while,for,或则定义变量的正则,请看下面:
if的正则匹配
String ifs = "if(\"1\".equals(\"1\") || 2 + 3 = 5 && 2 >3?true:false){";
String ifreg = "if\\([\\w\\!\\&<=+-/\\*\\>\\|\\.\\(\\)\"\\s\\?:]{0,}\\)\\{";
上面的正则表达式可以匹配ifs 字符串,涵盖了|| && 三目运算等,可以匹配大多数if分支语句。
while分支的话,就把if换成while就可以了。
for循环的正则比较复杂,因为存在新for循环和老for循环。案例如下:
String fors = "for(int i = 0; i < list.size();i++){";
String fors1 = "for(Map<String,String> map:tmp){";
String forreg = "for\\([\\w\\s;<\\>+=:,\\.\\(\\)]{0,}\\)\\{";
forreg能匹配fors和fors1两种类型的for循环字符串。
```
匹配变量的定义的正则表达式:
```
String define = "int[] a2 = new int[10];";
String define1 = "Map<String,String> a2 = new HashMap<String,String>();";
String define2 = "List<Map<String,String>> a2 = new ArrayList<HashMap<String,String>>();";
String define3 = "String test = \"\";";
String define4 = "String[] test = {};";
String defineReg = "[\\w<\\>,_\\[\\]]+\\s[\\w_]+\\s?=\\s?(new\\s)?[\"\"\\{\\}\\w;<\\>,\\(\\)\\[\\]]+";
如define 0 - 4,这5中常见的定义类型,都可以被defineReg匹配。
真实情况中,还存在很多种情况是上面匹配不到的,不过我没有遇到,如果有人使用了上面的正则,无法匹配对应的字符串。请给我留言。