正则表达式就是记录文本规则的代码。关于它的介绍,请参考“正则表达式30分钟入门教程”。本文以一个实例介绍它在Java语言下的应用。
假设我们想要分析一段C++代码,获取代码中定义的函数名称、返回类型、函数参数。如下所示都是C++定义的合法函数:
int get(int index)
char *get(char *str, int index)
double add(double a, double b)
char &get(char str[],int index)
- 匹配返回类型:(\w+\s+[\*,&]*\s*)
- 匹配函数名:(\w+\s*)
- 匹配函数参数:(\((\s*\w+\s+[\*,&]*\s*\w+(\[[0-9]*\])*(\s*,\s*\w+\s+[\*,&]*\s*\w+(\[[0-9]*\])*)*)?\s*\))
- 将上述三者合并:(\w+\s+[\*,&]*\s*)(\w+\s*)(\((\s*\w+\s+[\*,&]*\s*\w+(\[[0-9]*\])*(\s*,\s*\w+\s+[\*,&]*\s*\w+(\[[0-9]*\])*)*)?\s*\))
可以使用正则表达式工具(如Regex Match Tracer)对表达式进行判断:
工具的最下方会显示每个匹配模式的分组情况,这个根据正则表达式添加括号有关。如下图所示:
下面开始介绍Java与正则表达式的结合应用。
- Java提供java.util.regex.Pattern类保存正则表达式,上述的表达式我们可以按如下进行声明(因为Java保留了\作为转义字符,所以需要用\\转义):
Pattern p = Pattern.compile("(\\w+\\s+[\\*,&]*\\s*)(\\w+\\s*)(\\((\\s*\\w+\\s+[\\*,&]*\\s*\\w+(\\[[0-9]*\\])*(\\s*,\\s*\\w+\\s+[\\*,&]*\\s*\\w+(\\[[0-9]*\\])*)*)?\\s*\\))");
- 用java.util.regex.Pattern类对字符串进行正则表达式匹配:
Matcher m = p.matcher((CharSequence) string)
- 逐个获得匹配的字符串:
while (m.find()) {//find函数查询下一个匹配的字符串,如查询到则返回true String matched = m.group(0);//group获得匹配字符串的内容,下标代表分组值。下标及对应内容可以查看上图 String returnType = m.group(1); String methodName = m.group(2); }