如何将String解析为数组

时间:2014-07-19 14:36:25

标签: java arrays string arraylist

我有一个字符串(下面的例子),我想解析成一个数组

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

4 个答案:

答案 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。