我希望解析一个字符串并返回特定人的适配号。例如,我可以输入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);我相信有一个更简单、更简洁的解决方案,只使用一个正则表达式。然而,我对这个话题基本不熟悉。我的假设正确吗?如果是的话,你能解释一下你的regex解决方案吗?
发布于 2014-12-15 19:16:53
\{name : John, [^\}]*?fit : '(\d+)'.*?\}如果将这个regex模式应用于示例字符串,则该模式将匹配第一个组中的fit值。
以防万一您希望使用此方法解析JSON字符串:它不会那样工作。首先,您不能依赖于JSON中的属性顺序。
如果您真的想解析JSON,就像其他人提到的那样使用库。如果您的示例字符串是合法的,并且您只需要这样做,那么regex模式(或稍微修改一下的版本)就足够了。
发布于 2014-12-15 19:18:40
正如对这个问题的注释中所指出的那样,看起来您的输入数据可以转换为JSON弦,因此可以使用JSON解析库(如葛森 )进行解析。
在这种情况下,输入字符串s应该如下所示:
String s = "[{"name" : "John", "id" : 0, "fit" : 34 }, {"name" : "Paul", "id" : 0, "fit" : 34 }, {"name" : "Will", "id" : 0, "fit" : 24 }]";
发布于 2014-12-15 19:25:01
假设每个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“找到"fit”的值,只需执行result.get("Paul").get("fit")
https://stackoverflow.com/questions/27491239
复制相似问题