我需要使用正则表达式在字符串中找到任何类型的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++;
}
}
}
答案 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 强>