我有一个字符串(下面的例子),我想解析成一个数组
//just a stupid example
String s = "Mary Mark {John Brown} Honey lollipop Badger {Oh My God} {Such stupid}";
我有兴趣将该字符串分解为String [] []或ArrayList,所以如果我调用:
String[][] x = transform(s);
x将包含以下内容:
String[][] x = {{"Mary"}, {"Mark"}, {"John", "Brown"}, {"Honey"}, {"lollipop"}, {"Badger"}, {"Oh", "My", "God"}, {"Such", "stupid"}};
我该怎么做?
编辑:更改为2d数组
答案 0 :(得分:3)
您似乎正在寻找类似
的内容String s = "Mary Mark {John Brown} Honey lollipop Badger {Oh My God} {Such stupid}";
Pattern p = Pattern.compile("(?<=\\{)[^{}]+(?=\\})|\\w+");
Matcher m = p.matcher(s);
List<String[]> tokens = new ArrayList<String[]>();
while (m.find()) {
tokens.add(m.group().split("\\s+"));
}
String[][] result = tokens.toArray(new String[tokens.size()][]);
// lets see if it works as planned
System.out.println(Arrays.deepToString(result));
输出:
[[Mary], [Mark], [John, Brown], [Honey], [lollipop], [Badger], [Oh, My, God], [Such, stupid]]
说明:
"(?<=\\{)[^{}]+(?=\\})|\\w+"
是正则表达式,用于搜索
(?<=\\{)[^{}]+(?=\\})
字符不是{
也不是}
且介于{
和}
之间(不包括这些括号)。 (?<=...)
和(?=...)
是look-around机制\\w+
一个或多个字母数字字符在他们找到所有这些令牌后,他们会将它们分成任意一种或多个空格\\s+
来创建单独的字符串数组,以便
"foo".split("\\s+")
将成为数组["foo"]
"foo bar".split("\\s+")
将成为数组["foo", "bar"]
接下来,我使用toArray
方法将此类数组的列表转换为二维列表。
答案 1 :(得分:1)
我猜猜包含{}括号的子字符串应该被视为一个?
我建议您使用正则表达式来解析给定的字符串。我自己对正则表达式不是很友好,但下面的内容可能会对你有所帮助:
String s = "Mary Mark {John Brown} Honey lollipop Badger {Oh My God} {Such stupid}";
String p = "\\{[A-Za-z ]*\\}|\\w+";
Pattern pattern = Pattern.compile(p);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group());
}
然后预期的输出是:
Mary
Mark
{John Brown}
Honey
lollipop
Badger
{Oh My God}
{Such stupid}
答案 2 :(得分:0)
这里的东西很可能效率不高,但它有效,它基于大量的字符串操作并截断字符串中的部分:
public class StringSplitter
{
public static String[] transform(String string)
{
String[] splitString = string.split(" ");
List<String> listOfStrings = new ArrayList<String>();
int i = 0;
while(i < splitString.length)
{
if(!splitString[i].startsWith("{"))
{
listOfStrings.add(splitString[i]);
i++;
}
else
{
boolean concatEnd = false;
StringBuffer sb = new StringBuffer();
splitString[i] = splitString[i].substring(1);
sb.append(splitString[i]);
i++;
while(!concatEnd)
{
if(!splitString[i].endsWith("}"))
{
sb.append(" " + splitString[i]);
i++;
}
else
{
splitString[i] = splitString[i].substring(0, splitString[i].length()-1);
sb.append(" " + splitString[i]);
concatEnd = true;
i++;
}
}
listOfStrings.add(sb.toString());
}
}
return listOfStrings.toArray(new String[listOfStrings.size()]);
}
public static void main(String[] args)
{
String s = "Mary Mark {John Brown} Honey lollipop Badger {Oh My God} {Such stupid}";
for(String string : transform(s))
{
System.out.println(string);
}
}
}
输出:
Mary
Mark
John Brown
Honey
lollipop
Badger
Oh My God
Such stupid
答案 3 :(得分:0)
使用
Pattern.compile("\\{[A-Za-z ]*\\}|\\w+")
构建正则表达式模式。
然后致电
pattern.matcher(input)
获取输入字符串的匹配器。
然后使用
迭代结果匹配matcher.find()
对于每个匹配,添加
的输出match.split("\\s+")
(它给出了一个或多个单词的数组)到数组或List。