有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

  1. 我试图得到姓名,城市,邮政编码,然后工资,百分比的细节
  2. ()中的数据被视为名称字段的一部分
  3. For Name字段空间被视为有效,其他字段没有空间
  4. “平均工资”仅在文件末尾可用

通过Java中的正则表达式解析实现这一点容易吗


共 (1) 个答案

  1. # 1 楼答案

    如果文本文件是按空格对齐的,则可以(也可能应该)根据字符数提取字段。因此,您将每行中的第一个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
    }
    

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

    考虑这种情况:

    John Long-name Joe New York   21003
    

    如果您不知道第一个字段的长度最多为20个字符,您如何知道名称是John Long-name Joe而不是John Long-name Joe New?(注意John Long-name Joe的长度是19个字符,在它和New York中的New之间留有一个空格)

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

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