java - 正则表达式解析多行数据

标签 java regex string parsing multiline

我有来自文件的以下数据,我想看看是否可以在此处进行正则表达式解析

Name (First Name)   City       Zip
John (retired)                 10007
Mark                Baltimore  21268
....
....
Avg Salary
70000               100%

它不是一个大文件,文件中的全部数据都可以在带有换行符 (\n) 的 String 对象中使用(String data =“文件中的数据”)

  1. 我正在尝试获取姓名、城市、邮政编码以及工资、百分比详细信息
  2. () 内的数据被视为名称字段的一部分。
  3. 对于“名称”字段,空格被视为有效,其他字段没有空格。
  4. “平均薪资”仅在文件末尾可用

通过 Java 中的正则表达式解析可以轻松做到这一点吗?

最佳答案

如果文本文件是空格对齐的,您可以(并且可能应该)根据字符数提取字段。因此,您将每行中的前 n 个字符作为名字,接下来的 m 个字符作为城市,依此类推。

这是使用上述方法提取的代码,假设我们知道 header ,通过自动计算字段的字段长度。

String data = "data from the file";

// This is just to ensure we have enough space in the array
int numNewLines = data.length()-data.replace("\n","").length();
String[][] result = new String[numNewLines][3];
String[] lines = data.split("\n");
int avgSalary = 0;
int secondFieldStart = lines[0].indexOf("City");
int thirdFieldStart = lines[0].indexOf("Zip");
for(int i=1; i<lines.length; i++){
    String line = lines[i].trim();
    if(line.equals("Avg Salary")){
        avgSalary = Integer.parseInt(lines[i+1].substring(0,secondFieldStart).trim());
        break;
    }
    result[i-1][0] = line.substring(0,secondFieldStart).trim(); // First Name
    result[i-1][1] = line.substring(secondFieldStart,thirdFieldStart).trim(); // City
    result[i-1][2] = line.substring(thirdFieldStart).trim(); // Zip
}

使用正则表达式是可能的,但会更复杂。而且正则表达式无论如何都无法区分人名和城市名称:

考虑这种情况:

John Long-name Joe New York   21003

如果您不知道第一个字段的长度,您怎么知道名字是 John Long-name Joe 而不是 John Long-name Joe New最多20个字符? (请注意,John Long-name Joe 的长度为 19 个字符,与 New in New York 之间留有一个空格)

当然,如果您的字段由其他字符分隔(例如制表符 \t),您可以基于此拆分每一行。并且很容易修改上面的代码以适应这一点 =)

由于我上面提出的解决方案更简单,我想您可能想尝试一下 =)

关于java - 正则表达式解析多行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20647976/

相关文章:

java - 使用 Hibernate 作为 ORM 机制的 Web 应用程序中的 L1 和 L2 缓存有什么区别?

regex - 正则表达式排除关键字集

php - 正则表达式检测此模式 : something;something=something, some=something... 次数未知

c++ - 显示字符串中的空格

php - 如何将多维数组放入双引号字符串?

java - UserService 注销后检索到错误的用户

java - HashMap - 获取 "Can only iterate over an array or an instance of java.lang.Iterable"

java - 永远循环

javascript - JavaScript 正则表达式中 'y' 粘性模式修饰符的用途是什么?

java - 如何在任何 "character, but never at\"拆分字符串(在 Java 中)? RegEx 是否合适,如果合适,如何?