如何解析字符串并以键值形式提取数据?

Posted

技术标签:

【中文标题】如何解析字符串并以键值形式提取数据?【英文标题】:How to parse string and extract data in key - value form? 【发布时间】:2017-05-27 15:43:31 【问题描述】:

我需要解析从电子邮件内容创建的字符串并提取数据。电子邮件的结构如下所示:

Some email text..............
//these properties I have to extract
Name: SomeName
Surname: SomeSurname
Email: SomeEmail
Adress: some adress
etc...
Some email text................

你知道一些技巧,如何解析这个字符串并提取数据吗? 我找到了一些方法,但它是有缺陷的,因为当 value 有空格时它不起作用,就像上面的 Adress 一样。

    String searchText = "Name:";
    int lastIndexOf = content.lastIndexOf(searchText);
    String substring = content.substring( 1 + lastIndexOf + searchText.length());
    String substring1 = substring.substring(0, substring.indexOf(" "));

【问题讨论】:

这看起来像 yaml,可能使用 java yaml 解析器...,或者简单的content.split(':'),如果结果不为空,则修剪结果 java.util.Properties 可以是一种方式 【参考方案1】:

这是您的解决方案的代码:

    FileReader file;
    String sCurrentLine;
    String searchString = "Name";
    try 
        file = new FileReader("D:\\junk\\Sample.txt");

        BufferedReader br = new BufferedReader(file);

        br = new BufferedReader(new FileReader("D:\\junk\\Sample.txt"));

        while ((sCurrentLine = br.readLine()) != null) 

            String splitString = sCurrentLine.substring(0, sCurrentLine.indexOf(':'));
            splitString = splitString.replace(" ", "");
            if (splitString.equalsIgnoreCase(searchString)) 
                System.out.println(sCurrentLine.substring(sCurrentLine.indexOf(':')).replace(":",""));
                break;
            

        

     catch (FileNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

让我解释一下代码: 在这里,我们从文本文件中获取输入。文本文件包含 key-value 映射 读取文件后,我们将其解析为String,在本例中为sCurrentLine

然后,我们首先将字符串从':' 中拆分出来,然后我们删除所有空格,然后将拆分后的字符串存储在splitString 中,这样就变成了没有空格的键。

然后我们将splitStringsearchString 匹配。如果匹配,则打印':'之后的字符串部分。

希望对你有帮助!

【讨论】:

是的,逐行读取将是解决方案,但在我的情况下,我无法逐行读取,因为我从 javax.mail.Message 获取此字符串(作为内容),所以此字符串只有一行。 在这种情况下,您需要将 javax.mail.Message 转换为 String,然后按照上面提供的解决方法。在这种情况下,不需要 while 循环。只能使用 while 循环内的逻辑,其中 sCurrentLine 将是您在转换 javax.mail.Message 提要后获得的字符串。请参考以下链接获取灵感:***.com/questions/11240368/… 和 ***.com/questions/13474705/… 如果字符串真的只有一行,没有换行符,我不知道你怎么知道一个字段在哪里结束,下一个字段从哪里开始。但如果它是包含多行的单个字符串,如上所示,您可以使用StringReader(而不是 FileReader)来读取字符串中的行。这不是最有效的方法,但很容易。 并且根据数据的确切格式,您也许可以使用InternetHeaders 类来读取数据。

以上是关于如何解析字符串并以键值形式提取数据?的主要内容,如果未能解决你的问题,请参考以下文章

24)

11.1

如何解析没有分隔符的键值对的字符串?

如何从 firebase 获取特定文档数据并以字符串形式返回

JSON

列表的所有的input,将它的值以键值对的形式存放到一个数组里