用Java解析返回字符串

时间:2016-08-02 00:34:03

标签: java

我是Java新手。有人可以给我一些关于如何在返回的字符串中获取字符串值的线索:

[(key1,value1), (key2,value2), (key3, value3)]

另请注意,值字段还可能包含,逗号。我无法使用GSON方法,因为值在括号内和角括号内。唯一的解决方案是首先处理字符串以替换所有这些以符合JSON结构吗?

3 个答案:

答案 0 :(得分:1)

您的问题存在一些问题。由于解析的值和键可能包含逗号,并且键和值仅以逗号分隔,因此您只能猜测逗号之间的数字是否属于值或键。此外,您没有指定键和值的类型。

如果输入String格式不正确,则以下代码不会抛出异常,如果提供错误的输入,则可能永远运行。此外,它将键和值之间的第一个逗号解释为分隔符。 我假设键和值都是String 类型,可以自己解析:

HashMap<String, String> result = new HashMap<>(6);
String text = "[(age,120), (eyes,5), (feet, 8)]";

int index = text.indexOf("[") + 1; // now one index after '['
while (index < text.length() && text.charAt(index) != '(')
    index++; //skip until we hit the start: '('


//this loop runs once for every pair (key, value). In this example three times
main: while(index < text.length()) {
    index++; //skip '('

    // parse the key, until a comma appears
    int keyStart = index;
    while (text.charAt(index) != ',') index++;
    int keyEnd = index;

    index++; //skip ','

    // parse the value, until a closing bracket appears
    int valueStart = index;
    while (text.charAt(index) != ')') index++;
    int valueEnd = index;

    // extract the actual Strings, using the parsed indices start & end
    String key = text.substring(keyStart, keyEnd).trim();
    String value = text.substring(valueStart, valueEnd).trim();
    result.put(key, value);

    // parse to the next pair (x,y), or exit
    while (text.charAt(index) != '(') {
        if(text.charAt(index) == ']')
            break main; // finish parsing, break main loop
        index++;
    }
}

System.out.println(result); // output = {feet=8, eyes=5, age=120}

不相关的注释:此代码有效运行。使用String.substring,String.indexOf或甚至正则表达式,模式或类似的代码可能会多次处理相同的字符。 在此代码中,每个字符都被解析为exaclty一次,并且每个相关字符(值和键)仅被复制一次(并修剪)。

此外,语法相对自由:所有不相关的符号,如两对之间的任何文本,或空格,都会被忽略。 语法如下:

  1. 将解析[]之间任何数量(包括0)的对

  2. 每对必须用括号括起来;键和值必须用逗号分隔。将使用第一个逗号。示例:( name , value )

  3. 对中的名称可以包含任何符号,包括)],但逗号除外。对中的值可以包含每个符号,包括](,但结束括号除外。 名称和值周围的空格将被删除。示例:( my name , val,ue ) - &gt; name = my name和value = val,ue。请参见String.trim()。

    [(,)]也是有效的语法,将导致HashMap中出现空字符串。

答案 1 :(得分:0)

请注意,我实际上并未尝试过运行此操作=)

该方法基本上是分割关于正则表达式“(”“)”的输入,以获得表示对的字符串数组。

然后,您将迭代此数组,并提取第一个“,”之后的所有内容。在这里,我们隐含假设键可能不包含字符“,”。

String str[] = "[(key1,value1), (key2,value2), (key3, value3)]".split("(.*)");
ArrayList<String> values = new ArrayList<>();

String tmp;
for(int i = 0; i < str.length; i++) {
  values.add(str[i].substring(str[i].indexOf(","), str[i].length()))
}

答案 2 :(得分:0)

这是一个非常简单的例子,使用正则表达式来搜索键和值。注意;这不会支持包含空格的键/值对。它假定它只是一个单词。

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;


public class Main {
    private static final Pattern KEY_VALUE_PAIR = Pattern.compile("\\(\\s?+([^,\\s]+)\\s?,\\s?+([^)\\s?]+\\s?+)\\)");
    public static void main(String[] args) {
        Map<String, String> pairs = getKeyValuePairs("[(key1,value1), (key2,value2), (key3, value3)]");
        Iterator it = pairs.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry)it.next();
            System.out.println(pair.getKey() + " = " + pair.getValue());
            it.remove(); 
        }
    }

    private static Map<String, String> getKeyValuePairs(String input) {
        Map<String, String> matches = new HashMap<String, String>();
        Matcher m = KEY_VALUE_PAIR.matcher(input);
        while (m.find()) {
            matches.put(m.group(1), m.group(2));
        }
        return matches;
    }
}