我有一个文件,其中包含有关称为“泄漏”的参数的详细信息。文件中有一行提供了此信息。 “泄漏”有三种类型;短,中,长。在给定的时间可能不会显示所有泄漏。以下是6个文件中的泄漏信息示例。模式是type_of_leak(number_of_leaks)。
例如:
leak: short(4) medium(11) long(4)
leak: short(6)
leak: long(3)
leak: medium(4)
leak: medium(1) long(8)
leak: short(1) long(5)
我想按顺序提取三个泄漏值并填充一个整数数组。第0个元素短漏,第1个元素中漏和第2个元素长漏。如果未显示给定类别的泄漏,则该值应为“ 0”。下面是我正在使用的代码。我的代码可以提取泄漏,但是当泄漏数大于1位数时,它只能提取第一位数。
int[] leaks = new int[3];
if(line.contains("leak:")){ //search for the line that starts with leak
System.out.println(line);
//short leaks
if(line.contains("short")) {
int index = line.indexOf("short");
int numShortLeaks = Integer.parseInt((line.substring(index+6, index+7)));
leaks[0] = numShortLeaks;
}else {
leaks[0] = 0; //no short leaks replace with zero
}
if(line.contains("medium")) {
int index = line.indexOf("medium");
int numMediumLeaks = Integer.parseInt((line.substring(index+7, index+8)));
leaks[1] = numMediumLeaks;
}else {
leaks[1] = 0;
}
if(line.contains("long")) {
int index = line.indexOf("long");
int numLongLeaks = Integer.parseInt((line.substring(index+5, index+6)));
leaks[2] = numLongLeaks;
}else {
leaks[2] = 0;
}
答案 0 :(得分:1)
/leak:(?:\s+short\((\d+)\))?(?:\s+medium\((\d+)\))?(?:\s+long\((\d+)\))?
这将分别与组1、2和3中的短,中和长整数匹配。
即使未提供short,medium,long中的一个或多个,组号也将是正确的,因此第3组始终是long值,无论是否提供了short / medium。
String line = "leak: short(16) long(3)";
Pattern pattern = Pattern.compile("leak:(?:\\s+short\\((\\d+)\\))?(?:\\s+medium\\((\d+)\\))?(?:\\s+long\\((\\d+)\\))?");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
//Stick them in your array.
System.out.println("short " + matcher.group(1)); //16
System.out.println("medium " + matcher.group(2)); //null
System.out.println("long " + matcher.group(3)); //3
}
答案 1 :(得分:0)
通过示例
泄漏:短(4)中(11)长(4)
代码很简单
int leakIndex = line.indexOf("leak:");
if(leakIndex > -1) {
// Got the data
// 1. Split by tab to group like short(4) or medium(11) or long(4)
final String[] dataLine = line.subString(leakIndex + 1, line.length).split("\t");
// 2. Loop over the data line to extract the value
for(String data : dataLine) {
// I suggest you to create a sub function to extract
// 3. Simple idea is replaced all non number by empty value and we can parse it
if(data.contains("short")) {
leaks[0] = Integer.parseInt(data.replaceAll("[^0-9]", ""));
// TODO: You should handling NumberFormatException here
} else if() {
}
// Do other for medium and long here
} else {
// Skip
}
请注意:通过将一个长值存储到Int中会造成损失