按空格拆分Java String,而不是包含空格的双引号(“)

时间:2014-08-25 00:24:31

标签: java split

我希望在空格上分割短语,而不是在带引号的字符串中分隔空格(即双引号"对中的字符串)。

例如:

software term "on the fly" and "synchrony"

应分为以下5个部分:

software  
term   
on the fly  
and  
synchrony

那我怎么能在java中实现呢?

3 个答案:

答案 0 :(得分:6)

此正则表达式为您实现了分割,并清除了任何分隔引号:

String[] terms = input.split("\"?( |$)(?=(([^\"]*\"){2})*[^\"]*$)\"?");

它通过拆分空间来工作,但前提是后面跟着偶数引号。
引号本身已被消耗,因此它们不会在输出中结束,可选择将它们包括在分割术语中。
需要使用术语( |$)来捕获尾随引用。

请注意,如果可以引用第一个字词,则您需要首先清理该引号:

String[] terms = input.replaceAll("^\"", "").split("\"?( |$)(?=(([^\"]*\"){2})*[^\"]*$)\"?");

测试代码:

String input = "software term \"on the fly\" and \"synchron\"";
String[] terms = input.split("\"?( |$)(?=(([^\"]*\"){2})*[^\"]*$)\"?");
System.out.println(Arrays.toString(terms));

输出:

[software, term, on the fly, and, synchron]

答案 1 :(得分:0)

    String str = "software term \"on the fly\" and \"synchron\"";
    String[] arr = str.split("\""); // split on quote first
    List<String> res = new LinkedList<>();
    for(int i=0; i<arr.length; i++) {
        arr[i] = arr[i].trim();
        if ("".equals(arr[i])) {
            continue;
        }
        if (i % 2 == 0) {
            String[] tmp = arr[i].split("\\s+"); // second, split on spaces (when needed)
            for (String t : tmp) {
                res.add(t);
            }
        } else {
            res.add("\"" + arr[i] + "\""); // return the quote back to place
        }

    }
    System.out.println(res.toString());

<强>输出

[software, term, "on the fly", and, "synchron"]

答案 2 :(得分:0)

替代上一篇文章:

    boolean quoted = false;
    for(String q : str.split("\"")) {
        if(quoted)
            System.out.println(q.trim());
        else
            for(String s : q.split(" "))
                if(!s.trim().isEmpty())
                    System.out.println(s.trim());
        quoted = !quoted;
    }