首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

java 在字符串中截取方法名

发布网友

我来回答

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;
import java.util.List;

public class SubMethods {
public static void main(String[] args) {
String a = "add( 1, test2(1, 3), 3, test(inner3(12)) , test3(3), test4(1,2, in(a,b, out(1, 2 , k()),d), 4))";
SubMethods sub = new SubMethods();
List<MInfo> list = sub.run(a);
if (list != null) {
for (MInfo m : list)
System.out.println(m);
}
}

// 这个方法只是对methodString作个空格处理,可以去掉,何在main里面
public List<MInfo> run(String methodString) {
if (methodString == null)
return null;
methodString = methodString.trim(); // 去两端空格
List<MInfo> list = new ArrayList<MInfo>();
handler(list, methodString);
return list;
}

private void handler(List<MInfo> list, String ms) {
int endIdx = ms.indexOf(')'); // 找第一个)

// 第一个) 把字符串ms拆开
String before = ms.substring(0, endIdx); // 前部分
String end = ms.substring(endIdx + 1); // 后部分,不含 ),便于后面计算

int startIdx = before.lastIndexOf('('); // 前部分的最后一个(,这个和上面的)对应,表示一个方法的()

// 这样可以确定是否有参数了
MInfo bean = new MInfo();
// 取参数
if (endIdx - startIdx > 1) { // ()中可能有参数
String paramStr = ms.substring(startIdx + 1, endIdx).trim();
bean.setCount(paramStr.split(",").length);
}

// 根据开始(再取前部分
before = ms.substring(0, startIdx).trim();
// 取方法名
int pmStartIdx = -1;
// 是否还有(,有就表示在别的方法中
if ((pmStartIdx = before.lastIndexOf("(")) > 0) { // 表示被包含在别的方法中
int lastDH = before.lastIndexOf(',');// 看看是不是有逗号在中间
pmStartIdx = lastDH > pmStartIdx ? lastDH : pmStartIdx;
bean.setName(before.substring(pmStartIdx + 1, startIdx).trim());
// 因为是被包含,所以去掉本原字符串的中的本方法,继续迭代
String newMs = before.substring(0, pmStartIdx + 1) + "$" + end; // 用$替换当前方法,做为参数
handler(list, newMs);
} else {
bean.setName(before);
}
list.add(bean);
}
}

class MInfo {
private String name;
private int count;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("方法名:");
builder.append(name);
builder.append(", 参数个数:");
builder.append(count);
return builder.toString();
}

}

亲,如果没有问题且满意,请采纳,这样我才有动力继续回答,谢谢!!!

热心网友

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了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com