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



我有一个字符串

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

我想把这个字符串解析成两个列表:

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

,其中标签是冒号之前的单词(在我的示例中:abc, def, ijkmno)。也就是我想要

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

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

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

key被定义为:前面的字。

所以,你的分割模式将是", (?=[a-zA-z]+:)"这将按照指定的顺序检查comma space chars colon,查找前面的字符和冒号。

检查key,并使用向前看进行分割(因此保持键完整)。这将给你一个键值对数组

然后你可以用:分割得到键和值。

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

我会用正则表达式。我不确定如何在Java中做到这一点,但在python中,这将是:

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

在pythex上测试,输入abc:xy z uvw, def:g,hi, mno:rst。结果是:

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

首先从文件

中获取字符串
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[],的第一次分割中会表现得更好。

你得到你的行字符串。

//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

最新更新