正则表达式判断是否是一个java方法:
具体描述:
将一个java类读成流转换为字符串之后,需要用正则表达式判断是否存在java方法,
现在不知道正则表达式判断方法如何写正则表达式Java

解决方案 »

  1.   

    基本上%100肯定 每个class都 存在java方法
    楼主如果需要操作class,可以使用一些byte code java lib,比如 cglib, javassist
      

  2.   

    Lz的意思是用一个正则表达式,判断一个方法是否是java方法吗?
      

  3.   

    这个问题其实不太好解,但是如果把函数签名的每一个部分分开来用正则表达,就会相对容易许多。
    package com.tur.demo;public class Hello {
        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 List<Integer> foo(String name, Set<Double> values, ...)".matches(methodSignaturePattern));
        }
    }
      

  4.   

    再给你一个提取注释的正则,这样和方法就可以一起使用了。
    package com.tur.demo;import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class CommentRegExp {
        public static void main(String[] args) {
            String str = "\"\"\"String\\\" /*foo*/ text\"; biao /* // \"goto\" */ \"//hello /*comment*/\"// What's this.";        String emptyString  = "(\"\")";
            String normalString = "(\".*?[^\\\\]\")"; // 需要再处理"string\""的情况
            String lineComment  = "(//.+$)";
            String blockComment = "(/\\*.+?\\*/)";
            Pattern pattern = Pattern.compile(emptyString + "|" + normalString + "|" + lineComment + "|" + blockComment);
            Matcher matcher = pattern.matcher(str);        while (matcher.find()) {
                String matchedString = matcher.group(0);
    //            if (!matchedString.startsWith("\"")) {
                    System.out.println(matchedString);
    //            }
            }
        }
    }