我有一个字符串
String line = "abc:xyz uvw, def:ghi, mno:rst, ijk:efg, abc opq";
我想把这个字符串解析成两个列表:
ArrayList<String> tags;
ArrayList<String> values;
,其中标签是冒号之前的单词(在我的示例中:abc
, def
, ijk
和mno
)。也就是我想要
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