【问题标题】:Splitting the string in java is giving different results than expected [duplicate]在java中拆分字符串给出的结果与预期不同[重复]
【发布时间】:2016-10-24 02:57:04
【问题描述】:

您好,我是 Java 的新手,正在尝试使用 java 提供的 split method

输入是以下格式的字符串

broadcast message "Shubham Agiwal"

期望的输出要求是得到一个包含以下元素的数组

 ["broadcast","message","Shubham Agiwal"]

我的代码如下

  String str="broadcast message \"Shubham Agiwal\"";
    for(int i=0;i<str.split(" ").length;i++){
        System.out.println(str.split(" ")[i]);
    }

我从上面的代码得到的输出

["broadcast","message","\"Shubham","Agiwal\""]

有人可以让我在我的代码中进行哪些更改以获得上述所需的输出吗?

【问题讨论】:

标签: java arrays regex string split


【解决方案1】:

这很难直接拆分字符串。所以,我将使用 '\t' 来替换 如果空格不在“”中,则为空格。我的代码如下,你可以试试,也许其他人会有更好的解决方案,我们也可以讨论一下。

包 com.code.stackoverflow;

/** * 江超于 2016/10/24 创建。 */

公共类主{

public static void main(String args[]) {
    String str="broadcast message \"Shubham Agiwal\"";
    char []chs = str.toCharArray();
    StringBuilder sb = new StringBuilder();
    /*
    * false: means that I am out of the ""
    * true: means that I am in the ""
    */
    boolean flag = false;
    for (Character c : chs) {
        if (c == '\"') {
            flag = !flag;
            continue;
        }
        if (flag == false && c == ' ') {
            sb.append("\t");
            continue;
        }
        sb.append(c);
    }
    String []strs = sb.toString().split("\t");
    for (String s : strs) {
        System.out.println(s);
    }
}

}

【讨论】:

    【解决方案2】:

    这很乏味,但很有效。唯一的问题是,如果引号中的空格是制表符或其他空格分隔符,它将被替换为空格字符。

        String str = "broadcast message \"Shubham Agiwal\" better \"Hello java World\"";
        Scanner scanner = new Scanner(str).useDelimiter("\\s");
        while(scanner.hasNext()) {
            String token = scanner.next();
            if ( token.startsWith("\"")) { //Concatenate until we see a closing quote
                token = token.substring(1);
                String nextTokenInQuotes = null;
                do {
                    nextTokenInQuotes = scanner.next();
                    token += " ";
                    token += nextTokenInQuotes;
                }while(!nextTokenInQuotes.endsWith("\""));
    
                token = token.substring(0,token.length()-1); //Get rid of trailing quote
            }
    
            System.out.println("Token is:" + token);
        }
    

    这会产生以下输出:

    Token is:broadcast
    Token is:message
    Token is:Shubham Agiwal
    Token is:better
    Token is:Hello java World
    

    【讨论】:

    • 我跟随@Tushar 链接到原始解决方案。非常优雅的问题解决方案。谢谢
    【解决方案3】:
    public static void main(String[] arg){
        String str = "broadcast message \"Shubham Agiwal\"";
        //First split 
        String strs[] = str.split("\\s\"");
        //Second split for the first part(Key part)
        String[] first = strs[0].split(" ");
        for(String st:first){
            System.out.println(st);
        }
        //Append " in front of the last part(Value part)
        System.out.println("\""+strs[1]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多