我有来自文件的以下数据,我想看看是否可以在此处进行正则表达式解析
Name (First Name) City Zip John (retired) 10007 Mark Baltimore 21268 .... .... Avg Salary 70000 100%
它不是一个大文件,文件中的全部数据都可以在带有换行符 (\n) 的 String 对象中使用(String data =“文件中的数据”)
- 我正在尝试获取姓名、城市、邮政编码以及工资、百分比详细信息
- () 内的数据被视为名称字段的一部分。
- 对于“名称”字段,空格被视为有效,其他字段没有空格。
- “平均薪资”仅在文件末尾可用
通过 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/