2016-10-24 4 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

[Split строку на пробелы в Java, за исключением случаев, между кавычками] (http://stackoverflow.com/questions/7804335/split-string-on -spaces-in-java-except-if-between-quotes-ie-treat-hello-wor), [токенизация строки, но игнорирование разделителей внутри кавычек] (http://stackoverflow.com/questions/3366281/tokenizing-a -string-but-ignoring-delimiters-in-quotes), [Regex для разделения строки с использованием пробела, когда она не окружена одинарными или двойными кавычками] (http://stackoverflow.com/questions/366202/regex-for-splitting- a-string-using-space-when-not-around-by-single-or-double) – Tushar

+1

Двойной раскол выглядит изворотливым. –

+1

Вы вводите код 'split' 9 раз, каждый раз получая одинаковый результат. Хотя код не делает то, что вы хотите, в следующий раз, когда вы захотите написать что-то вроде этого, он будет более читабельным и быстрее сохранить результат в массиве первым, перед циклом. – ajb

ответ

1

Это трудно разбить строку напрямую. Так что я буду использовать '\ t' для замены пробелов, если пробел отсутствует. Мой код ниже, вы можете попробовать его, и, возможно, у других будет лучшее решение, мы можем обсудить его тоже.

package com.code.stackoverflow;

/** * Создано jiangchao в 2016/10/24. */

общественного класса Main {

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

Я следил за ссылкой @Tushar к исходному решению. Очень элегантное решение проблемы. благодаря – cswace

Смежные вопросы