【问题标题】:How do I get what's inbetween " " in a user inputted String? Java如何在用户输入的字符串中获取“”之间的内容?爪哇
【发布时间】:2013-09-06 03:02:20
【问题描述】:

我想检索某人作为字符串输入的引号中的任何内容,我假设它是我需要的子字符串,但我不确定如何。

当用户输入一个由一个空格分隔的单词和数字混合的字符串时: 嘿 110 说“我不太擅长 Java”,但“我可以钓鱼”

然后我希望能够获取“我不太擅长 Java”和“我可以很好地钓鱼”并打印出引号内的内容,以便字符串中可以有多个引号。 现在我有 if(userInput=='"') 然后我用子字符串做一些事情,但我不确定是什么。

不幸的是,我不能使用 split、trim、tokenizer、regex 或任何能让这变得非常容易的东西。

这一切都在这个方法中,我尝试识别字符串中的某些内容是单词、数字还是引号:

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


        } 

    }


}

谢谢!

【问题讨论】:

  • 你能用String#indexOfString#lastIndexOfString#subString...吗?
  • 是的,但 indexOf 只取字符串中的第一个值,而 lastIndexOf 只取最后一个值,如果有多个引号,我希望它工作
  • 我没有得到一个好的答案。
  • 那你为什么接受一个?
  • 我觉得我会很好

标签: java string substring double-quotes


【解决方案1】:

尝试下一个:

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

【讨论】:

  • 我不能用这个。正则表达式或模式或任何东西
  • 我不允许使用数组,它只能扫描用户输入一次。抱歉,这是一个很好的答案
  • 没问题。没有数组。
【解决方案2】:

我不确定这是否正是您要查找的内容,但它会逐步删除引用的部分...

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,这样我就可以保持顺序,也许可以使用某种标志来确定它们是什么类型......

【讨论】:

  • 谢谢,这太棒了!但我试图不总是回到第一次输入 " 和最后一次。
  • 是的,不允许使用 split :(
  • 嗯,但我不知道引号的长度到目前为止它只是字符串中的一堆字符
  • 哪个报价?你关心复合引号吗?
  • 用户将输入类似的内容: blah blah 123 "hello" 234 "world" 。我想识别什么是数字或引号并打印出每个单词,因此我将通过 if userInput charAt(index)=='"' 来识别引号,并且我想打印出该初始值的所有内容" to it's end" 但我不知道每个引号的长度只知道整个字符串
【解决方案3】:

遍历字符串并使用临时 int 变量来存储引用的字符串何时开始。当你看到它结束时,你可以提取该子字符串并用它做你想做的事情。

【讨论】:

  • 感谢您的帮助,但我如何看到它结束了。这一切都在一个for循环中
  • 检查是否在您当前位于带引号的字符串中时看到等于 " 的字符。
【解决方案4】:

【讨论】:

    【解决方案5】:
    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));
        }
    }
    

    }

    【讨论】:

      【解决方案6】:
      public String getNextQuote(int index, String sentence){
       return sentence.substring(sentence.indexOf("\"", index + 1), sentence.indexOf("\"", index + 2));
      }
      

      用法:以索引为参数调用方法。此索引类似于您遇到的最后一个 " 的索引。

      之后,它将返回接下来两个引号之间的所有内容。

      【讨论】:

      • 但是 indexOf 不是只取字符串中第一个 " 的实例吗?
      • 有一个从指定索引开始的第一次出现的重载。
      • 当字符串中有多个引号时它仍然有效吗?比如:你好“世界”代码代码“代码”123“代码”。而且我没有从用户那里获取索引,我是否从在 forloop 中具有索引的 setter 方法中获取它?
      • 当您循环遍历它以确定下一个字符是什么类型的字符时,您应该将索引保留在程序中的某个位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      相关资源
      最近更新 更多