Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按空格分割Java字符串,而不是按包含空格的双引号(";)分割_Java_Split - Fatal编程技术网

按空格分割Java字符串,而不是按包含空格的双引号(";)分割

按空格分割Java字符串,而不是按包含空格的双引号(";)分割,java,split,Java,Split,我希望在空格上拆分短语,而不是在带引号的字符串中拆分空格(即,一对双引号内的字符串“) 例如: software term "on the fly" and "synchrony" 应分为以下5个部分: software term on the fly and synchrony 那么我如何在java中实现这一点呢?这个正则表达式为您实现了拆分,并清除了任何分隔引号: String str = "software term \"on the fly\" and \"

我希望在空格上拆分短语,而不是在带引号的字符串中拆分空格(即,一对双引号内的字符串

例如:

software term "on the fly" and "synchrony"
应分为以下5个部分:

software  
term   
on the fly  
and  
synchrony

那么我如何在java中实现这一点呢?

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

    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());
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]

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

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]

上一个员额的备选方案:

    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;
    }

上一个员额的备选方案:

    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;
    }

你不能重写Java本身的规则……有些语言足够灵活,但Java不行。我认为问题在于如何编写一个函数,将字符串
“software term\”on fly\”和“synchron\”
转换为列表
[“software”,“term”,“on fly”,“and”,“synchron”]
。是的,这是我所期望的结果。任何人都知道如何用Java API实现这一点。请注意,重复是相同的基本问题,但重复的逗号和引号在
[
]
上分开。只需将该正则表达式中的逗号替换为空格,并将
\[
替换为
\”
@Bohemian似乎不是这样。你测试过你建议的那些更改吗?你不能重写Java本身的规则……有些语言足够灵活,但Java却不行。我认为问题在于如何编写一个函数来转换字符串
“软件术语”和“同步”
到列表
[“软件”、“术语”、“动态”、“和”、“同步”]
。是的,这是我期望的结果。任何人都知道如何用Java API实现这一点。请注意,重复是相同的基本问题,但重复在
[
上以逗号和引号分隔
-只需将该正则表达式中的逗号替换为空格,并将
\\[
替换为
\”
@Bohemian似乎不是这样。您是否测试了您建议的更改?