如何在Java中的字符串中的双引号之间获取字符串

时间:2014-04-01 14:44:53

标签: java string quotes

例如,输入将如下:

AddItem rt456 4  12 BOOK “File Structures” “Addison-Wesley” “Michael Folk”

我希望通过使用扫描仪读取所有内容并将其放入数组中。

像:

   info[0] = rt456
   info[1] = 4
   ..
   ..
   info[4] = File Structures
   info[5] = Addison-Wesley

那么如何在引号之间获取字符串?

编辑:我的代码的一部分 - >

public static void main(String[] args) {
            String command;
        String[] line = new String[6];
        Scanner read = new Scanner(System.in);
        Library library = new Library();

        command = read.next();

        if(command.matches("AddItem"))
        {
            line[0] = read.next(); // Serial Number
            line[1] = read.next(); // Shelf Number
            line[2] = read.next(); // Shelf Index
            command = read.next(); // Type of the item. "Book" - "CD" - "Magazine"

            if(command.matches("BOOK"))
            {
                line[3] = read.next(); // Name
                line[4] = read.next(); // Publisher
                line[5] = read.next(); // Author

                Book yeni = new Book(line[0],Integer.parseInt(line[1]),Integer.parseInt(line[2]),line[3],line[4],line[5]);


    }
    }
}

所以我使用read.next来读取没有引号的字符串。

使用REGEX AS解决

read.next("([^\"]\\S*|\".+?\")\\s*");

4 个答案:

答案 0 :(得分:2)

您可以在紧要关头使用StreamTokenizer。如果在String上操作,请使用StringReader进行换行。如果在文件上操作,只需将Reader传递给它。

// Replace “ and ” with " to make parsing easier; do this only if you truly are
// using pretty quotes (as you are in your post).
inputString = inputString.replaceAll("[“”]", "\"");

StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(inputString));
tokenizer.resetSyntax();
tokenizer.whitespaceChars(0, 32);
tokenizer.wordChars(33, 255);
tokenizer.quoteChar('\"');

while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    // tokenizer.sval will contain the token
    System.out.println(tokenizer.sval);
}

您必须对非ASCII文本使用适当的配置,以上只是一个示例。

如果您想单独提取数字,那么默认的StreamTokenizer配置就可以了,尽管它使用double并且不提供int数字令牌。令人讨厌的是,如果不从头开始重置语法,就不可能简单地禁用数字解析。

如果您不想搞砸这一切,您还可以考虑将输入格式更改为更方便的内容,如Steve Sarcinella's good suggestion中所述,如果合适的话。

答案 1 :(得分:1)

作为参考,请看一下:Scanner Docs

您从扫描仪读取的方式取决于您向用户显示数据的方式。

如果他们在一行上输入所有内容:

Scanner scanner = new Scanner(System.in);
String result = "";
System.out.println("Enter Data:");
result = scanner.nextLine();

否则,如果您将其拆分为输入字段,则可以执行以下操作:

Scanner scanner = new Scanner(System.in);
System.out.println("Enter Identifier:");
info[0] = scanner.nextLine();
System.out.println("Enter Num:");
info[1] = scanner.nextLine();
...

如果要在将数据分配给变量之前验证任何内容,请尝试使用scanner.next("");,其中引号包含匹配的正则表达式模式

修改

检查here是否有正则表达式信息。

举个例子,假设我有一个字符串

String foo = "The cat in the hat";

正则表达式(正则表达式)可用于以非常快速有效的方式操作此字符串。如果我接受该字符串并执行foo = foo.replace("\\s+", "");,这将替换任何空格,因此消除空格。

分解参数\\s+,我们有\s,这意味着匹配任何空白字符。

\之前的额外\s是一个转义字符,可以正确读取\s

+表示匹配前一个表达式0次或更多次。 (全部匹配)。

所以foo,在运行replace之后,将是“TheCatInTheHat”

同样,这个正则表达式逻辑可以应用于scanner.next(String regex);

希望这会有所帮助,我不是最好的解释:)

答案 2 :(得分:0)

使用凌乱的正则表达式的另一种选择:

public static void main(String[] args) throws Exception {
    Pattern p = Pattern.compile("^(\\w*)[\\s]+(\\w*)[\\s]+(\\w*)[\\s]+(\\w*)[\\s]+(\\w*)[\\s]+[“](.*)[”][\\s]+[“](.*)[”][\\s]+[“](.*)[”]");
    Matcher m = p.matcher("AddItem rt456 4  12 BOOK “File Structures” “Addison-Wesley” “Michael Folk”");

    if (m.find()) {
        for (int i=1;i<=m.groupCount();i++) {
            System.out.println(m.group(i));
        }
    }
}

打印:

AddItem
rt456
4
12
BOOK
File Structures
Addison-Wesley
Michael Folk

我假设引号是在问题“”中键入它们而不是&#34;&#34;,因此它们不需要转义。

答案 3 :(得分:-1)

你可以试试这个。我已根据您的要求准备了演示

  public static void main(String args[]) {
      String str = "\"ABC DEF\"";
      System.out.println(str);
      String str1 =  str.replaceAll("\"", "");
      System.out.println(str1);
  }

阅读后,只需用空字符串替换双引号