基于“”和空格拆分字符串

时间:2014-06-22 04:22:40

标签: java string

我有一个String str,它由几个由单个空格分隔的单词组成。 如果我想创建一个字符串集或列表,我可以简单地调用str.split(" "),我会得到我想要的。

现在,假设str稍微复杂一些,例如它就像:

    str = "hello bonjour \"good morning\" buongiorno";

在这种情况下,我希望保留" "之间的内容,以便我的字符串列表为:

    hello
    bonjour
    good morning
    buongiorno

显然,如果我在这种情况下使用了split(" "),那么它就不会工作,因为我会得到

    hello
    bonjour
    "good
    morning"
    buongiorno

那么,我如何得到我想要的东西?

3 个答案:

答案 0 :(得分:3)

您可以创建一个正则表达式,用于查找“”之间的每个单词或单词:

\w+|(\"\w+(\s\w+)*\")

并使用Pattern和Matcher类搜索它们。

离。

String searchedStr = "";
Pattern pattern = Pattern.compile("\\w+|(\\\"\\w+(\\s\\w+)*\\\")");
Matcher matcher = pattern.matcher(searchedStr);
while(matcher.find()){
    String word = matcher.group();
}

编辑:适用于“”中的每个字数。 XD忘记了

答案 1 :(得分:2)

您可以执行以下操作。首先使用" \""分割Sting。然后使用空格"分割其余的。 " 。偶数代币将是引号""。

之间的代币
public static void main(String args[]) {

    String str = "hello bonjour \"good morning\" buongiorno";
    System.out.println(str);
    String[] parts = str.split("\"");
    List<String> myList = new ArrayList<String>();
    int i = 1;
    for(String partStr : parts) {
        if(i%2 == 0){
            myList.add(partStr);
        }
        else {
            myList.addAll(Arrays.asList(partStr.trim().split(" ")));
        }
        i++;
    }

    System.out.println("MyList : " + myList);


}

,输出

hello bonjour "good morning" buongiorno
MyList : [hello, bonjour, good morning, buongiorno]

答案 2 :(得分:1)

您可以使用正则表达式找到解决方案,但我要做的只是手动编写字符串断路器。

List<String> splitButKeepQuotes(String s, char splitter) {
    ArrayList<String> list = new ArrayList<String>();
    boolean inQuotes = false;
    int startOfWord = 0;

    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == splitter && !inQuotes && i != startOfWord) {
            list.add(s.substring(startOfWord, i));
            startOfWord = i + 1;
        }
        if (s.charAt(i) == "\"") {
            inQuotes = !inQuotes;
        }
    }

    return list;
}