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

时间:2014-12-15 19:04:10

标签: java regex

我正在寻找解析字符串并返回特定人的合适号码。例如,我可以输入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);

我相信只使用一个正则表达式就有一个更简单,更简洁的解决方案。但是,我对这个话题基本上不熟悉。我的假设是否正确?如果是这样,你能解释一下你的正则表达式解决方案吗?

4 个答案:

答案 0 :(得分:1)

\{name : John, [^\}]*?fit : '(\d+)'.*?\}

这个正则表达式模式将匹配第一组中的fit的值,如果它应用于您的示例字符串。

以防万一你要使用这种方法解析JSON字符串:它不会像那样工作。您不能完全依赖JSON中的属性顺序。

如果你真的想解析JSON,请像其他人提到的那样使用库。 如果您的示例字符串是合法的,并且您只需要执行此操作,则正则表达式模式(或稍微修改的版本)应该足够了。

答案 1 :(得分:0)

正如对问题的评论中所指出的,只需稍微努力就可以将输入数据转换为JSON string,因此可以使用JSON解析库解析,例如{{3 }}

在这种情况下,您的输入String应如下所示:

String s = "[{"name" : "John", "id" : 0, "fit" : 34 }, {"name" : "Paul", "id" : 0, "fit" : 34 }, {"name" : "Will", "id" : 0, "fit" : 24 }]";

答案 2 :(得分:0)

假设每个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);
}

现在,为了找到“保罗”的“适合”值,你可以result.get("Paul").get("fit")

答案 3 :(得分:0)

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