匹配任何方法签名的Java正则表达式

匹配任何方法签名的Java正则表达式,java,regex,Java,Regex,我需要使用正则表达式在字符串中查找任何类型的Java方法签名。这就是我到目前为止所做的,它不是很漂亮。我需要帮助的最后一件事是实现case7,将方法与多个参数匹配,并使regex更加简洁易读 import java.util.regex.Matcher; import java.util.regex.Pattern; class MethodMatcher { public static void main(String[] args) { String PARA

我需要使用正则表达式在字符串中查找任何类型的Java方法签名。这就是我到目前为止所做的,它不是很漂亮。我需要帮助的最后一件事是实现case7,将方法与多个参数匹配,并使regex更加简洁易读

 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++;
    }

}

}

这看起来更像是家庭作业或手指练习,而不是实际的项目。这是一个跳转开始:

^\s*([a-zA-Z_]\w+)\s*(?:\(|\G)(\s*([a-zA-Z_]\w+)\s+([a-zA-Z_]\w+),?)*\)\s*$
更新:以下模式允许无限的
args
(不需要锚定):

原始演示代码:

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));
            }
        }
    }
}
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共T类
{
公共静态void main(字符串[]args)
{
最终字符串regex=“^\\s*\n”
+“([a-zA-Z\\\w+)#函数名\n”
+“\\s*\n”
+“(?:\\(\\\\G)\n”
+(\\s*([a-zA-Z\\\w+)\\s+([a-zA-Z\\\w+)*#args\n
+“\\)\n”
+“\\s*$”;
final String=“\u validName\u(\u TypeName\u variable)\n”
+“7invalidName(\u TypeName变量)\n”
+“不良名称(\u pp8p\u 7\u s5de)\n”
+“有效名称\\n”
+“有效名称(7BadType变量)\n”
+“有效名称(无效参数)\n”
+“有效名称(类型1 arg1,类型2 arg2)”;
final Pattern=Pattern.compile(regex,Pattern.COMMENTS | Pattern.MULTILINE);
final Matcher Matcher=pattern.Matcher(字符串);
while(matcher.find()){
System.out.println(“完全匹配:+matcher.group(0));

对于(int i=1;我不尝试它。你使用了错误的工具来完成这项工作。你需要一个解析器。你会想出一个这样的方法,你会不断发现异常并对其进行调整。永远。它永远都不会对。不可能。注释呢?泛型类型?注释?你想处理它们吗?不仅仅是方法签名(名称,参数)关于(1)数组,(2)多维数组,(3)限定类型,(4)泛型,所有这些都是(5)返回值和(6)参数类型;(7)varargs,(8)呢…@wp78de这是我正在做的一个个人项目。产品所有者拒绝了parsers@wp78de,尝试将线程上方显示的更新正则表达式与Java演示进行协调,我发现它以“^\s*(?:^\s*”开头,而代码中的表达式以“^\s*”开头-忽略第二个子表达式(?:^\s*“在我看来,这似乎没有什么作用。仔细检查,表达式似乎只捕获了最后一个参数。这不是致命的,但它确实让我困惑了很长一段时间。@DavidA.Gray是的,这是正确的。现有模式对于验证或提取目的最有用,但对于解析也不有用。我现在会对其进行不同的设计。
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));
            }
        }
    }
}