我希望解析一个字符串并返回特定人员的适合数字。 例如,我可以输入Paul
,我的方法应该返回34
。
目前,我通过使用String
的substring
方法来实现这一点(我的字符串将始终保持相同的格式):
String s = "{name : John, id : '0', fit : '34' }, {name : Paul, id : '0', fit : '34' },{name : Will, id : '0', fit : '24' } ";
String mainGrouping = s.substring(s.indexOf("Paul"));
System.out.println("Main Grouping: "+ mainGrouping);
String subGrouping = mainGrouping.substring(0, mainGrouping.indexOf('}'));
System.out.println("Sub grouping: " + subGrouping);
String fitGrouping= subGrouping.substring(subGrouping.indexOf("fit"));
String finalAnswer = fitGrouping.replaceAll("[^0-9]", "");
System.out.println("final substring: " + finalAnswer);
我相信有一个更简单、更简洁的解决方案,只使用一个正则表达式。但是,我对这个话题基本上不熟悉。我的假设正确吗?如果是这样,你能解释一下你的正则表达式解决方案吗?
{name : John, [^}]*?fit : '(d+)'.*?}
如果此正则表达式模式应用于示例字符串,则此正则表达式模式将与第一组中的 fit 值匹配。
以防万一您想使用此方法解析 JSON 字符串:它不会那样工作。首先,您不能依赖 JSON 中的属性顺序。
如果您真的想解析 JSON,请使用其他人提到的库。如果您的示例字符串是合法的,并且您只需要这样做进行练习,则正则表达式模式(或略微修改的版本)应该就足够了。
假设每个name
都有一个与之关联的fit
,并且每个名称都出现在其各自的fit
之前,这样的事情应该可以工作:
Matcher matcher = pattern.compile("name: " + nameToFind + ", .*?fit:'(d+)'").matcher(s);
String fit = matcher.find() ? matcher.group(1) : null;
如果您要重复执行此操作,并且可能针对不同的属性,请考虑将while字符串解析为映射(映射):
Matcher m = Pattern.compile("\{(.+?)\}").matcher(s);
Pattern p = Pattern.compile("(w+?): '?(\w*?)'?");
Map<String, Map<String, String>> result = new HashMap<>();
while(m.find()) {
Matcher m2 = p.matcher(m.group(1));
Map<String, String> map = new HashMap<>();
while(m2.find()) { map.put(m2.group(1), m2.group(2)); }
result.put(map.get("name"), map);
}
现在,要找到"Paul"的"适合"值,你可以做result.get("Paul").get("fit")
正如问题的评论中所述,看起来只需稍加努力,您的输入数据就可以转换为 JSON 字符串,因此可以使用 JSON 解析库(例如 Gson)进行解析。
在这种情况下,输入字符串 s 应如下所示:
String s = "[{"name" : "John", "id" : 0, "fit" : 34 }, {"name" : "Paul", "id" : 0, "fit" : 34 }, {"name" : "Will", "id" : 0, "fit" : 24 }]";
public class RegexEx {
public static void main(String[] args) {
String s = "{name : John, id : '0', fit : '34' }, "
+ "{name : Paul, id : '0', fit : '34' },"
+ "{name : Will, id : '0', fit : '24' } ";
String name="John";
String age = getAge(s, name);
System.out.println(age);
}
private static String getAge(String s, String name) {
String age=null;
Pattern namePattern = Pattern.compile("name : "+name+"(.*)\d\d");
String[] arr = s.split("}");
for (String str : arr) {
Matcher matcher = namePattern.matcher(str);
while (matcher.find()) {
Pattern numPattern = Pattern.compile("\d\d");
String match=matcher.group();
Matcher numMatcher = numPattern.matcher(match);
if(numMatcher.find())
age=numMatcher.group();
}
}
return age;
}
}