2013-09-06 2 views
0

Я хотел бы получить все, что есть в кавычках, которые кто-то вводит как строку, я предполагаю, что это подстрока, которая мне нужна, но я не уверен, как это сделать.Как получить то, что находится между «" в введенном пользователем столбце? Java

Когда пользователь вводит строку, смешанную со словами и числами всех разделенных одним пробелом: эй 110 сказать: «Я не очень хорошо на Java», но «я рыбу очень хорошо»

Тогда я хочу быть в состоянии принять «Я не очень хорошо разбираюсь в Java» и «Я могу очень хорошо ловить рыбу» и распечатать то, что внутри кавычек, поэтому в строке могут быть несколько кавычек. прямо сейчас у меня есть if (userInput == '"'), тогда я что-то делаю с подстрокой, но я не уверен, что.

Я не могу использовать split, trim, tokenizer, regex или что-нибудь, что сделало бы это очень легко Unfortunatley

это все в этом методе, где я пытаюсь определить, если что-то в строке слово, число или цитаты:.!

public void set(String userInput)// method set returns void 
    { 
     num=0;// reset each variable so new input can be passed 

     String empty=""; 
     String wordBuilder=""; 
     userInput+=" "; 
     for(int index=0; index<userInput.length(); index++)// goes through each character in string 
     { 

      if(Character.isDigit(userInput.charAt(index)))// checks if character in the string is a digit 
      { 

       empty+=userInput.charAt(index); 



      } 
      else 
      { 
       if (Character.isLetter(userInput.charAt(index))) 
      { 

       wordBuilder+=userInput.charAt(index); 

      } 
       else 
       { 
        if(userInput.charAt(index)=='"') 
       { 
        String quote=(userInput.substring(index,); 

       } 
       } 
       //if it is then parse that character into an integer and assign it to num 
       num=Integer.parseInt(empty); 
       word=wordBuilder; 


       empty=""; 
       wordBuilder=""; 
      } 


     } 

    } 


} 

Благодаря

+0

Вы можете использовать 'Строка # indexOf',' Строка # lastIndexOf' и 'Строка # subString' ...? – MadProgrammer

+0

yes, но indexOf принимает только первое значение в строке, а lastIndexOf занимает только последнее. Я хочу, чтобы он работал, если есть несколько котировок. – user2601122

+0

. Я не получил хорошего ответа на этот вопрос. – user2601122

ответ

0

Я не уверен, если это совсем то, что вы ищете, но это будет раздеться процитированные части ступенчато ...

String quote = "I say: \"I have something to say, \"It's better to burn out then fade away\"\" outloud..."; 

if (quote.contains("\"")) { 

    while (quote.contains("\"")) { 
     int startIndex = quote.indexOf("\""); 
     int endIndex = quote.lastIndexOf("\""); 
     quote = quote.substring(startIndex + 1, endIndex); 
     System.out.println(quote); 
    } 

} 

Какие выходы ...

I have something to say, "It's better to burn out then fade away" 
It's better to burn out then fade away 

Обновлено

Я не знаю, если это измена или нет ...

String quote = "I say: \"I have something to say, \"It's better to burn out then fade away\"\" outloud...\"Just in case you don't believe me\""; 

String[] split = quote.split("\""); 
for (String value : split) { 
    System.out.println(value); 
} 

Какие выходы ...

I say: 
I have something to say, 
It's better to burn out then fade away 

outloud... 
Just in case you don't believe me 

Обновлено

Хорошо , подделка String#split

StringBuilder sb = new StringBuilder(quote.length()); 
for (int index = 0; index < quote.length(); index++) { 
    if (quote.charAt(index) == '"') { 
     System.out.println(sb); 
     sb.delete(0, sb.length()); 
    } else { 
     sb.append(quote.charAt(index)); 
    } 
} 

Обновлено

Хорошо, это в основном поддельные split с вариантами ...

String quote = "blah blah 123 \"hello\" 234 \"world\""; 

boolean quoteOpen = false; 
StringBuilder sb = new StringBuilder(quote.length()); 
for (int index = 0; index < quote.length(); index++) { 
    if (quote.charAt(index) == '"') { 
     if (quoteOpen) { 
      System.out.println("Quote: [" + sb.toString() + "]"); 
      quoteOpen = false; 
      sb.delete(0, sb.length()); 
     } else { 
      System.out.println("Text: [" + sb.toString() + "]"); 
      sb.delete(0, sb.length()); 
      quoteOpen = true; 
     } 
    } else { 
     sb.append(quote.charAt(index)); 
    } 
} 
if (sb.length() > 0) { 
    if (quoteOpen) { 
     System.out.println("Quote: [" + sb.toString() + "]"); 
    } else { 
     System.out.println("Text: [" + sb.toString() + "]"); 
    } 
} 

Который генерирует ...

Text: [blah blah 123 ] 
Quote: [hello] 
Text: [ 234 ] 
Quote: [world] 

Знаешь, я не знаете, как вы храните результаты.Я был бы соблазн создать некоторые основные классы, которые были способны к хранению String результатов и добавить их к List, чтобы я мог поддерживать порядок и, возможно, использовать флаг какого-то, чтобы определить, какой тип они ...

+0

Спасибо, это было бы замечательно ! но я стараюсь не всегда возвращаться к первому «введенному и последнему». – user2601122

+0

Да, не разрешено использовать split :( – user2601122

+0

Хм, но я не знаю длины цитаты, пока это всего лишь кучка символов в строке – user2601122

0

перебирать струны и используйте временную переменную int для хранения, когда q Начата инициализированная строка. Когда вы увидите, что это закончится, вы можете извлечь эту подстроку и сделать то, что вы хотите с ней.

+0

Спасибо за помощь, но как я вижу, что она заканчивается. это все в цикле for – user2601122

+0

Проверьте, нет ли символа, равного «пока вы находитесь внутри строки с кавычками». –

+0

Итак, новый цикл? Я не уверен, что это сработало бы в моем случае. – user2601122

0
public class MyTestSecond { 
public static void main(String...args){ 

    String a = "hey 110 say \"I am not very good at Java\""; 
    // Method 1 
    if(a.contains("\"")) 
     System.out.println(a.substring(a.indexOf("\""),a.lastIndexOf("\"")+1)); 
    //Method 2 
    String[] array = a.split(" "); 
    for(int i=0;i<array.length;i++){ 
     if(array[i].startsWith("\"")) 
      System.out.println(a.substring(a.indexOf("\""),a.lastIndexOf("\"")+1)); 
    } 
} 

}

0
public String getNextQuote(int index, String sentence){ 
return sentence.substring(sentence.indexOf("\"", index + 1), sentence.indexOf("\"", index + 2)); 
} 

Использование: вызов метода с индексом в качестве параметра. Этот индекс напоминает индекс последнего ", с которым вы столкнулись.

Впоследствии он вернет все, что будет между следующими двумя кавычками.

+0

Но разве indexOf не принимает только первый экземпляр« в строке? – user2601122

+0

Существует перегрузка, которая принимает первое вхождение, начиная с указанного индекса. –

+0

будет ли он работать, если в строке есть несколько кавычек? например: hello "world" code code "code" 123 "code". и я не беру указатель от пользователя, я беру это из метода setter, у которого есть индекс в forloop? – user2601122

2

Попробуйте следующее:

public static void main(String[] args) { 
    String input = "\"123\" hey 110 say \"I am not very good at Java\" but \" I can fish pretty well\""; 
    int indexQuote = -1; 
    boolean number = true; 
    String data = ""; 
    for (int i = 0; i < input.length(); i++) { 
     char ch = input.charAt(i); 
     if (Character.isWhitespace(ch)) { 
      if (data.length() > 0 && indexQuote == -1) { 
       if (number) { 
        System.out.println("It's a number: " + data); 
       } else { 
        System.out.println("It's a word: " + data); 
       } 
       // reset vars 
       number = true; 
       data = ""; 
      } else if (indexQuote != -1) { 
       data += ch; 
      } 
     } else if (ch == '"') { 
      if (indexQuote == -1) { 
       number = false; 
       indexQuote = i; 
      } else { 
       System.out.println("It's a quote: " + data); 
       // reset vars 
       number = true; 
       data = ""; 
       indexQuote = -1; 
      } 
     } else { 
      if (!Character.isDigit(ch)) { 
       number = false; 
      } 
      data += ch; 
      if (data.length() > 0 && i == input.length() - 1) { 
       if (number) { 
        System.out.println("It's a number: " + data); 
       } else { 
        System.out.println("It's a word: " + data); 
       } 
      } 
     } 
    } 
} 

Выходные:

It's a word: hey 
It's a number: 110 
It's a word: say 
It's a quote: I am not very good at Java 
It's a word: but 
It's a quote: I can fish pretty well 
+0

Я не могу использовать это. regex или шаблоны или все что угодно – user2601122

+0

Извините. Я обновил свой ответ. –

+0

Мне не разрешено использовать массивы, и он может только сканировать пользовательский ввод один раз. извините, это отличный ответ, хотя – user2601122