解析以下字符串的有效方法?

时间:2011-09-16 14:06:41

标签: java

我以字符串形式从服务器获得以下响应...

value_one=3342342&value_two=456344445&value_three=235333223

解析此问题的有效方法是什么?我能想到的一切都非常混乱。

4 个答案:

答案 0 :(得分:6)

拆分'&',循环,拆分'='

public static Map<String, String> getQueryMap(String query)
{
    String[] params = query.split("&");
    Map<String, String> map = new HashMap<String, String>();
    for (String param : params)
    {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }
    return map;
}

答案 1 :(得分:1)

如果您打算解析多个字符串,那么重复使用String.split()方法不是一个好主意,因为它每次都会重新编译拆分正则表达式。

Pattern ampPattern = Pattern.compile("&");
Pattern eqPattern = Pattern.compile("=");
...

Map<String, Long> results = new HashMap<String, Long>();
for (String param : ampPattern.split(input)) {
  String[] pair = eqPattern.split(param);
  results.put(pair[0], Long.valueOf(pair[1]));
}

但是对于这样一个简单的输入字符串,根本不使用regexp会更有效,并且避免创建临时String数组。也许是这样的:

Map<String, Long> results = new HashMap<String, Long>();
int start = 0;
int next;
do {
  next = input.indexOf('&', start);
  int end = next == -1 ? input.length() : next;
  int k = input.indexOf('=', start);
  results.put(input.substring(start, k), Long.valueOf(input.substring(k + 1, end)));
  start = next + 1;
} while (next > -1);

当然,如果你只解析几次这个字符串,那么这样的优化可能不值得。

答案 2 :(得分:0)

首先将字符串拆分为“&amp;”。这将为您提供标记,每个标记由一个名称和值对组成,其中“=”将它们分开。因此,根据需要将它们分成“=”。除非你有其他要求,否则对我来说似乎很简单。

答案 3 :(得分:0)

一种天真的方法就是使用String.split

String input = "value_one=3342342&value_two=456344445&value_three=235333223"
String[] rawAttrs = input.split("&");

// Split each attribute into pairs - assume some sort of Pair class exists
List<Pair<String, String>> attributes = new ArrayList<Pair<String, String>>();
for (String rawAttr : rawAttrs) {
    String[] parts = rawAttrs.split("=");
    attributes.add(new Pair<String, String>(parts[0], parts[1]);
}

此方法不能很好地处理格式错误的条目 - 但更重要的是,如果部分属性值包含=&字符,则不会考虑会发生什么。这些反斜杠是逃脱的吗?它们是否经过URL编码?还有其他一些方法可以嵌入它们吗?

如果你可以保证这些值是整数,那么这不会有问题,但是你需要确保覆盖所有的基础。