Java Regular Expression匹配任何方法签名

时间:2018-04-01 23:14:44

标签: java regex

我需要使用正则表达式在字符串中找到任何类型的Java方法签名。这是我到目前为止它不是很漂亮。我需要帮助的最后一部分是实现case7,具有多个参数的匹配方法,并使正则表达式更简洁和可读。

 import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    class MethodMatcher {

public static void main(String[] args) {

    String PARAM_ARG_PATTERN
            = Pattern.quote("(") + 
            "(([\\s]*[a-zA-Z_][\\w\\d]*[\\s]*[a-zA-Z_][\\w\\d]*[\\s]*)|[\\s]*)" 
            + Pattern.quote(")");

    String METHOD_NAME_PATTERN = "[\\s]+[a-zA-Z_][\\w\\d]+[\\s]*";

    String METHOD_PATTERN = METHOD_NAME_PATTERN + PARAM_ARG_PATTERN;

    String case1 = " _validName__ ( _TypeName _variable)";
    String case2 = " 7invalidName (_TypeName variable)";
    String case3 = "badName_ (_pp8p_7 _s5de)";   //method Name has no leading space
    String case4 = " Valid4Name_()";                 //No Parameter ValidName( )
    String case5 = " validName(7BadType variable)";
    String case6 = " validName_(InvalidParam)";     //no variable name
    String case7 = " validName(Type1 arg1, Type2 arg2)"; //but fails need help implementing

    String cases[] = {case1, case2, case3, case4, case5, case6, case7};
    int c = 1;
    Pattern p = Pattern.compile(METHOD_PATTERN);

    for (String strMethod : cases) {
        Matcher m = p.matcher(strMethod);
        if (m.find())
            System.out.println(strMethod + " passed");
        c++;
    }

}

}

1 个答案:

答案 0 :(得分:2)

这看起来更像是家庭作业或手指练习而不是实际项目。这是一个快速启动:

^\s*([a-zA-Z_]\w+)\s*(?:\(|\G)(\s*([a-zA-Z_]\w+)\s+([a-zA-Z_]\w+),?)*\)\s*$

更新:以下模式允许无限制args(不需要锚点恕我直言):

^\s*(?:^\s*([a-zA-Z_]\w+)\s*\(\s*|\G,\s*)(\s*([a-zA-Z_]\w+)\s+([a-zA-Z_]\w+),?)*\)\s*$

原始演示代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class T
{
  public static void main(String[] args)
  {

        final String regex = "^\\s*\n" 
                            + "([a-zA-Z_]\\w+)                                    # function name\n" 
                            + "\\s*\n" 
                            + "(?:\\(|\\G)\n" 
                            + "(\\s*([a-zA-Z_]\\w+)\\s+([a-zA-Z_]\\w+),?)*           #args\n" 
                            + "\\)\n" 
                            + "\\s*$";

        final String string = " _validName__ ( _TypeName _variable)\n" 
                            + " 7invalidName (_TypeName variable)\n" 
                            + "badName_ (_pp8p_7 _s5de)\n" 
                            + " Valid4Name_()\n" 
                            + " validName(7BadType variable)\n" 
                            + " validName_(InvalidParam)\n" 
                            + " validName(Type1 arg1, Type2 arg2)";

        final Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS | Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }
    }
}

<强> Updated Demo