Java正则表达式解析字符串 xxx(a)xxx(a,b)xxx(a,b,c,d)把函数名,函数参数取出。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这类用正则处理并不稳妥,主要是碰到参数类型为 字符串 时,里面如果包含了括号、逗号一类内容时,会出现问题。建议自己写个简单代码做搜索,分为两层:1、找到 xxx(....);2、把 ... 解析为为: a,b,c 的参数。 把第二个匹配组的值再用逗号拆开吧 public static void main(String[] args) { String s="xxx(a,b,c,d)"; Pattern p = Pattern.compile("(\\w+)\\((.*)\\)"); Matcher m = p.matcher(s); while(m.find()){ System.out.println(m.group(1)); System.out.println(m.group(2)); } } 那这个去加工一下就可以了public class MethodSignatureRegExp { public static void main(String[] args) { String m = "public List<int> foo(Type name, ...)"; // 名字,模板,类型的正则 String namePattern = "[_a-zA-Z]+\\w*"; String templatePattern = "(<[_a-zA-Z]+\\w*(, [_a-zA-Z]+\\w*)*>)?"; String typePattern = namePattern + templatePattern; // 参数的正则 String argPatternZero = ""; // 无参数 String argPatternDynamic = "..."; // 动态参数 String argPattern = typePattern + " " + namePattern; // 一个参数 String argPatternOne = argPattern + "(, ...)?"; // 一个参数 + 动态参数 String argPatternMulti = argPattern + "(, " + argPattern + ")*(, ...)?"; // 多个参数 + 动态参数 String argsPattern = "(" + argPatternZero + "|" + argPatternDynamic + "|" + argPatternOne + "|" + argPatternMulti + ")"; // 方法签名的正则 String methodSignaturePattern = "(public|protected|private)( static)?( final)? " + typePattern + " " + namePattern + "\\(" + argsPattern + "\\)"; // 每个部分的正则测试 System.out.println("List<int, Object>".matches(typePattern)); System.out.println("".matches(argPatternZero)); System.out.println("...".matches(argPatternDynamic)); System.out.println(argPatternOne); System.out.println("int age".matches(argPatternOne)); System.out.println(argPatternMulti); System.out.println("int age, List<Integer> values".matches(argPatternMulti)); System.out.println("int age, List<Integer> values, ...".matches(argsPattern)); // 测试是否一个方法的签名 // 暂时规则,单词间只用一个空格分隔,因为实现情况要考虑回车,多个空格,tab键等,把空格在正则中换成\\s+ // 例如要在','前后加\\s*,函数签名中的'(', ')'前后加\\s* // 这里为了不使正则变得太难懂,直接只用了一个空格. System.out.println(methodSignaturePattern); System.out.println("public void foo()".matches(methodSignaturePattern)); System.out.println("public void foo(...)".matches(methodSignaturePattern)); System.out.println("public List<Integer> foo(String name, Set<Double> values, ...)".matches(methodSignaturePattern)); }} applet小程序的入口在那里?书上的例子,貌似不对。 求详解-一道考试题 急!请高手帮忙解决一个java调用Runtime执行命令行问题? telnet返回字符如何控制?如何根据协议控制?谢谢 java Class问题 请高手帮忙 在线等!!如何用jsp显示下拉列表框的内容 答题 什么是ERP软件实施 嗨,出学者的烦恼,没找到一本适合的书!只好问简单的问题了 怎样用代码copy一个文件? 文件下载:在ie6可以正常下载,但在ie5.5却不能下载。 JAVA求解,我这个Label运行后不显示
1、找到 xxx(....);
2、把 ... 解析为为: a,b,c 的参数。
public static void main(String[] args) {
String s="xxx(a,b,c,d)";
Pattern p = Pattern.compile("(\\w+)\\((.*)\\)");
Matcher m = p.matcher(s);
while(m.find()){
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
public class MethodSignatureRegExp {
public static void main(String[] args) {
String m = "public List<int> foo(Type name, ...)"; // 名字,模板,类型的正则
String namePattern = "[_a-zA-Z]+\\w*";
String templatePattern = "(<[_a-zA-Z]+\\w*(, [_a-zA-Z]+\\w*)*>)?";
String typePattern = namePattern + templatePattern; // 参数的正则
String argPatternZero = ""; // 无参数
String argPatternDynamic = "..."; // 动态参数
String argPattern = typePattern + " " + namePattern; // 一个参数
String argPatternOne = argPattern + "(, ...)?"; // 一个参数 + 动态参数
String argPatternMulti = argPattern + "(, " + argPattern + ")*(, ...)?"; // 多个参数 + 动态参数
String argsPattern = "(" + argPatternZero + "|" + argPatternDynamic + "|" + argPatternOne + "|" + argPatternMulti + ")"; // 方法签名的正则
String methodSignaturePattern = "(public|protected|private)( static)?( final)? " +
typePattern + " " + namePattern + "\\(" + argsPattern + "\\)"; // 每个部分的正则测试
System.out.println("List<int, Object>".matches(typePattern));
System.out.println("".matches(argPatternZero));
System.out.println("...".matches(argPatternDynamic));
System.out.println(argPatternOne);
System.out.println("int age".matches(argPatternOne));
System.out.println(argPatternMulti);
System.out.println("int age, List<Integer> values".matches(argPatternMulti));
System.out.println("int age, List<Integer> values, ...".matches(argsPattern)); // 测试是否一个方法的签名
// 暂时规则,单词间只用一个空格分隔,因为实现情况要考虑回车,多个空格,tab键等,把空格在正则中换成\\s+
// 例如要在','前后加\\s*,函数签名中的'(', ')'前后加\\s*
// 这里为了不使正则变得太难懂,直接只用了一个空格.
System.out.println(methodSignaturePattern);
System.out.println("public void foo()".matches(methodSignaturePattern));
System.out.println("public void foo(...)".matches(methodSignaturePattern));
System.out.println("public List<Integer> foo(String name, Set<Double> values, ...)".matches(methodSignaturePattern));
}
}