2011-09-16 63 views
3

我碰到一个字符串形式的服务器如下回应......一种有效的方法来解析下面的字符串?

value_one=3342342&value_two=456344445&value_three=235333223

什么是解析这个的有效途径?我能想出的一切都很混乱。上“&”,循环,分割上“=”

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

用'&'分割,然后用'='分割? – Blindy

+0

我想将数值作为关键值对的一部分发回。 – Skizit

+0

*“什么是解析此问题的有效方法?”*在互联网上向随机陌生人请求为您做这件事通常是'高效'的。 *“我能想出的一切都很麻烦。”*这导致了这个问题[“你试过了什么?”](http://mattgemmell.com/2008/12/08/what-have-you-tried /)。 –

回答

6

拆分令牌每个由名称和值对具有“ =“将它们分开。所以根据需要将它们分成“=”。除非你有其他要求,否则对我来说似乎很简单。

+0

请原谅明显,但String.split()每次都会编译正则表达式。此外,你正在分割相同的字符串多次。 –

+0

@Eugene,够公平的。我为可读性提出了过早的优化。 – Joe

0

第一分割一个“&”。这会给你串

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编码的?有没有其他方式可以嵌入?

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

+0

在另一个答案中看到我关于String.split()的评论。 –

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

然而,对于这样一个简单的输入字符串这将是更有效率在所有不使用正则表达式,避免临时的字符串数组的创建。也许是这样的:

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

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

+0

Upvote。为了避免在这样简单的问题中使用正则表达式应该总是被授予。 – coolcfan

相关问题