在 java 中使用正则表达式的更简洁的解决方案



我希望解析一个字符串并返回特定人员的适合数字。 例如,我可以输入Paul,我的方法应该返回34

目前,我通过使用Stringsubstring方法来实现这一点(我的字符串将始终保持相同的格式):

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;
    }
}

最新更新