2016-10-24 6 views
0

こんにちは、私はJavaに新しく、split methodをjavaで使用しようとしています。javaで文字列を分割すると、予想外の結果が出る

入力出力要求を所望

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\""] 

誰かが私は上記のように所望の出力を得るために私のコードに変更する必要があるものを私にさせることができますか?

+4

[引用符の間にある場合を除いて、Javaのスペースに分割文字列、](http://stackoverflow.com/questions/7804335/split-string-on -space-in-java-except-between-quotes-ie-treat-hello-wor)、[文字列をトークン化するが、引用符内の区切り文字を無視する](http://stackoverflow.com/questions/3366281/tokenizing-a -string-but-ignoring-delimiters-within quotes)、[一重引用符や二重引用符で囲まれていないときにスペースを使って文字列を分割する正規表現](http://stackoverflow.com/questions/366202/regex-for-splitting- a-string-using-space-single-or-doubleで囲まれていない場合) – Tushar

+1

ダブルスプリットがドギーに見えます。 –

+1

あなたは 'split'を9回コールし、毎回同じ結果を出します。コードはあなたが望むことをしませんが、次にこのようなことを書いておきたいときは、ループの前にまず配列に結果を保存する方が読みやすく、速いです。 – ajb

答えて

1

これは文字列を直接分割するのが難しいので、空白が ""でなければ、 '\ t'を使用して を空白に置き換えます。私のコードは以下の通りです。あなたはそれを試すことができ、他の人がより良い解決策を取るかもしれません。

package com.code.stackoverflow;

/** * 2016/10/24にjiangchaoによって作成されました。 */

パブリッククラスメイン{

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

}

-1
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]); 
} 
0

これは面倒ですが、それは動作します。唯一の問題は、引用符内の空白がタブまたは他の空白区切り文字であれば、空白文字で置き換えられることです。

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 
+0

私は元のソリューションに@タクサーリンクをたどった。非常にエレガントな解決策です。ありがとう – cswace

関連する問題