【问题标题】:How to get the string between double quotes in a string in Java [duplicate]如何在Java中获取字符串中双引号之间的字符串[重复]
【发布时间】:2014-05-12 10:16:42
【问题描述】:

例如,输入将是:

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 来读取不带引号的字符串。

通过使用正则表达式解决

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

【问题讨论】:

  • 读完书后,将分隔符改为"。或者使用使用空格作为分隔符的 CSV 解析器。
  • new StreamTokenizer(new StringReader(mystring)) 应该可以解决问题。
  • 字段的个数,字段的位置每次都一样吗?
  • 你为什么不逃避他们? "->\"
  • ” 或 "?双引号是您输入的内容吗?

标签: java string quotes


【解决方案1】:

您可以在紧要关头使用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,如果合适的话。

【讨论】:

    【解决方案2】:

    作为参考,看看这个: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";
    

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

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

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

    + 表示匹配前一个表达式 0 次或多次。 (匹配所有)。

    所以 foo 在运行替换后将是“TheCatInTheHat”

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

    希望这会有所帮助,我不擅长解释 :)

    【讨论】:

    • +1 好建议,拆分成字段 -- 更改输入格式是一种非常简单的方法。
    • 我用的是第一个。但我不知道如何使用正则表达式。
    【解决方案3】:

    使用凌乱的正则表达式的替代方法:

    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
    

    我假设引号是您在问题“”而不是“”中输入的引号,因此不需要转义。

    【讨论】:

    • 你能解释一下你的正则表达式吗?哦,它已经被接受为答案。所以用户会在不知道代码在做什么的情况下复制粘贴
    • 我也觉得正则表达式是这样做的方式,可能是因为我是 StreamTokenizer 的新手
    • 几个字母数字组 \w 之间有一个或多个空格 \s+ 和三个组 [“](.*)[”] 引号,字符组引号。这不是谜。它按组列出。它可能会做得更好,更简单
    【解决方案4】:

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

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

    阅读后只需将双引号替换为空字符串

    【讨论】:

    • 这不会产生 OP 描述的输出。 OP 希望将引用的字符串解析为单个标记,而不是去掉引号。请参阅所需输出的示例。
    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多