如何解析字符串并以键值形式提取数据?
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
中,这样就变成了没有空格的键。
然后我们将splitString
与searchString
匹配。如果匹配,则打印':'
之后的字符串部分。
希望对你有帮助!
【讨论】:
是的,逐行读取将是解决方案,但在我的情况下,我无法逐行读取,因为我从 javax.mail.Message 获取此字符串(作为内容),所以此字符串只有一行。 在这种情况下,您需要将 javax.mail.Message 转换为 String,然后按照上面提供的解决方法。在这种情况下,不需要 while 循环。只能使用 while 循环内的逻辑,其中 sCurrentLine 将是您在转换 javax.mail.Message 提要后获得的字符串。请参考以下链接获取灵感:***.com/questions/11240368/… 和 ***.com/questions/13474705/… 如果字符串真的只有一行,没有换行符,我不知道你怎么知道一个字段在哪里结束,下一个字段从哪里开始。但如果它是包含多行的单个字符串,如上所示,您可以使用StringReader(而不是 FileReader)来读取字符串中的行。这不是最有效的方法,但很容易。 并且根据数据的确切格式,您也许可以使用InternetHeaders 类来读取数据。以上是关于如何解析字符串并以键值形式提取数据?的主要内容,如果未能解决你的问题,请参考以下文章