如何解析" key1:value1,value,key2:value3"字符串到ArrayLists?

时间:2015-07-21 06:52:48

标签: java

我有一个字符串

String line = "abc:xyz uvw, def:ghi, mno:rst, ijk:efg, abc opq";

我想将这个字符串解析为两个列表:

ArrayList<String> tags;
ArrayList<String> values;

其中标签是冒号前的单词(在我的示例中为abcdefijkmno)。那是我想要的

tags = Arrays.asList("abc", "def", "mno", "ijk");
values = Arrays.asList("xyz uvw", "ghi", "rst", "efg, abc opq");

请注意,这些值可以包含空格逗号,而不只是一个单词。

4 个答案:

答案 0 :(得分:2)

由于您的值可以包含逗号,因此您需要在找到key时拆分。

key被定义为:之前的单词。

因此,您的拆分模式为", (?=[a-zA-z]+:)" 这将按指定的顺序检查comma space chars colon,查看字符和冒号。

检查key,并使用预测进行拆分(从而保持密钥完好无损)。这将为您提供一组keyValue对

然后您可以使用:进行拆分以获取密钥和值。

String str = "Your string";
String[] keyValuePairs = str.split(", (?=[a-zA-z]+:)");
for (String keyValuePair : keyValuePairs) {
    String[] keyvalue = keyValuePair.split(":");
    keysArray.add(keyvalue[0]);
    valuesArray.add(keyvalue[1]);
}

答案 1 :(得分:2)

我会选择正则表达式。我不知道如何在Java中执行此操作,但在python中这将是:

(\w+):([ ,\w]+)(,|$)

使用输入abc:xy z uvw, def:g,hi, mno:rstpythex上进行了测试。结果是:

Match 1
1.  abc
2.  xy z uvw
3.  ,

Match 2
1.  def
2.  g,hi
3.  ,

Match 3
1.  mno
2.  rst
3.  Empty

因此,对于每个匹配,您将获得位置1中的键和2中的值。分隔符存储在3

答案 2 :(得分:1)

首先从文件中获取字符串

List<String> tags = new ArrayList<String>();
List<String> values = new ArrayList<String>;
String lineThatWasRead = ...

然后我们用逗号分隔它来获得对,并且每个pari分割为:

List<String> separatedStringList = Arrays.asList(lineThatWasRead.split(","));

for (String str : separatedStringList)
{
    //Since it is possible values also contain commas, we have to check
    //if the current string is a new pair of tag:value or just adding to the previous value

    if (!str.contains(":"))
    {
        if (values.size > 0)
        {
           values.set(values.size() - 1, values.get(values.size()-1) + ", " + str);
           continue; //And go to next str since this one will not have new keys
        }
    }

    String[] keyValArray = str.split(:);
    String key = keyValArray[0];
    String val = keyValArray[1]; 
    tags.add(key);
    values.add(val);   
}

请注意,您不必使用列表,但我只是喜欢它们提供的灵活性。有些人可能认为String[],的第一次拆分效果会更好。

答案 3 :(得分:-1)

你的行为字符串。

//your code here
String line = //your code here
String[] stuff = line.split(":")// this will split your line by ":" symbol.
stuff[0] //this is your key
stuff[1] //this is your value