发布网友
共5个回答
热心网友
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ParseString {
private static final String PARAM_KEY = "!";
public static void main(String[] args) throws Exception {
// 待解析字符串
String method = "methodName(methodName2(methodName4(2,3,4),2),methodName3(),strName)";
// 这句很重要,先删除字符串中所有的空格,后面的正则中不再需要考虑空字符问题
method = method.replaceAll("\\s+", "");
// 输出结果
for (Map.Entry<String, Integer> entry : parseMethod(method).entrySet()) {
System.out.println(entry.getKey() + " --- " + entry.getValue());
}
}
private static Map<String, Integer> parseMethod(String method) {
Map<String, Integer> ret = new HashMap<>();
Pattern p = Pattern.compile("^([^\\(]+)\\((.*)\\)$");
Matcher m = p.matcher(method);
if (!m.find())
throw new RuntimeException("错误的方法字符串:" + method);
// 找到方法
Map<String, Integer> paramMap = parseParams(m.group(2));
ret.put(m.group(1).trim(), paramMap.remove(PARAM_KEY));
ret.putAll(paramMap);
return ret;
}
private static Map<String, Integer> parseParams(String params) {
Map<String, Integer> ret = new HashMap<>();
int count = 0;
while(params.length() > 0) {
if (params.split(",")[0].indexOf("(") >= 0) {
// 第一个参数为方法
String method = findFirstMethod(params);
params = (method.length() == params.length()) ? "" : params.substring(method.length() + 1);
ret.putAll(parseMethod(method));
} else {
// 第一个参数为非方法
params = params.replaceAll("[^,]+(,(.+))*", "$2");
}
count++;
}
ret.put(PARAM_KEY, count);
return ret;
}
private static String findFirstMethod(String params) {
String method = "";
boolean start = false;
int matchCount = 0;
for (int i = 0; i < params.length(); i++) {
char ch = params.charAt(i);
if (ch == '(') {
start = true;
matchCount++;
} else if (ch == ')') {
matchCount--;
}
method += params.substring(i, i + 1);
if (start && matchCount == 0) break;
}
if (start)
return method;
throw new RuntimeException("错误的参数字符串:" + params);
}
}
热心网友
上面的几位“穿梭巴”说的还靠谱,但是没有明白楼主的意思。楼主的意思是,能获取每个方法的名字和参数个数!可以在穿梭巴的方法中稍加修改,用递归和正则表达式就轻松解决了:
public class TestText {
public TestText() {
}
public void test(String method) {
int first = method.indexOf("(");
int last = method.lastIndexOf(")");
int b = method.indexOf("=");
String methodName = method.substring(0, first);
System.out.println(method + "方法的名字:" + methodName.substring(b + 1));
String par = method.substring(first + 1, last);
String[] parm = par.trim().split(",");
int count = 0;
if (par != null && !par.trim().isEmpty()) {
count = parm.length;
}
System.out.println(method + "方法参数个数" + count);
for (String p : parm) {
String regex = "[\\s\\S]+\\(([\\s\\S]*)\\)";
if (Pattern.matches(regex, p)) {
test(p);
}
}
}
public static void main(String[] args) {
String method = "a = methodName(methodName2(),methodName3(),strName));";
TestText test = new TestText();
test.test(method);
}
}
运行结果:
a = methodName(methodName2(),methodName3(),strName));方法的名字: methodName
a = methodName(methodName2(),methodName3(),strName));方法参数个数3
methodName2()方法的名字:methodName2
methodName2()方法参数个数0
methodName3()方法的名字:methodName3
methodName3()方法参数个数0
望采纳!手工测试通过!追问→【我不是比干】
a = methodName(methodName2(methodName4(2,3,4),2),methodName3(),strName));
用这个字符串,你的程序就不对了。
methodName 参数3
methodName2 参数2
methodName4 参数3
methodName3 参数0
辛苦你了。我能力有限。我自己也在研究呢。
追答对的啊,我后面输出的是参数个数啊!
热心网友
想了个算法,自己测试了多种情况,都没问题,你看看合适不;
具体的计算过程,都在注释中
import java.util.ArrayList;亲,如果没有问题且满意,请采纳,这样我才有动力继续回答,谢谢!!!
热心网友
String md ="a = methodName(methodName2(),methodName3(),strName) ";
int zero=md.indexOf("=");
int first=md.indexOf("(");
int last = md.lastIndexOf(")");
String name = md.substring(zero+1, first).trim();//方法名
String methodnames = md.substring(first+1, last).trim();
String methods[] = methodnames.split(",");//参数名的数组
System.out.println(name);
System.out.println(methodnames);
for(int i=0 ;i<methods.length;i++){
System.out.println(methods[i]);
}
热心网友
subString就ok了