正则表达式解析多行数据

时间:2013-12-18 01:17:47

标签: java regex string parsing multiline

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

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

它不是一个大文件,文件中的所有数据都在String对象中可用,带有换行符号(\ n)(字符串数据=“文件中的数据”)

  1. 我想获得名字,城市,邮编,然后是工资,百分比细节
  2. data()中的数据被视为Name字段的一部分。
  3. 对于名称字段空间被视为有效,并且没有其他字段的空间。
  4. '平均薪资'仅在文件末尾提供
  5. 通过Java中的正则表达式解析可以很容易吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

当然,如果您的字段被其他字符分隔(例如制表符\t),则可以根据该字符拆分每一行。并且很容易修改上面的代码以适应=)

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