我有文字文件。它包含每行中的分隔数据,如
120 US 1 ALASKA 4.
在某些行中缺少一些数据。喜欢,
US 1 ALASKA 4
由于它是由空格分隔的,我使用split来获取令牌。我无法确定缺少哪些数据。
在下面的代码中,示例input1将验证120
的{{1}}。如果该行中缺少^[1-9]+$
,如示例120
,input2
将token[0]
,它将验证US
并给{{1} }}。而不是这个,我想知道缺少哪个值。因此,我可以显示错误^[1-9]+$
,而"Error in a"
应该包含"Error a i missing"
,以便我可以正确验证。
有人可以就上述做法提出一些建议吗?
token[1]
答案 0 :(得分:0)
你可以像下面这样(考虑到你有四个元素),你的模式是数字字符串数字串号
if (firstdata is not a number & firstdata is String) {
//display alert as first data is missing
// move the token data
e=d;
d=c;
c=b;
b=a;
}
为第二名数据做同样的事情......等等......
确定缺少的内容,您将不得不移动数据......
以下是我的意思....这是经过测试和验证的代码,适用于您提供的两个输入..
public class checkForPattern {
public static void main(String[] args) {
String line = "120 US 1 ALASKA 4"; // Sample input1
// String line = "US 1 ALASKA 4"; //Sample input2
String delimiter = "[ ]+";
String tokens[] = line.split(delimiter);
String a = "", b = "", c = "", d = "", e = "";
try {
a = tokens[0];
b = tokens[1];
c = tokens[2];
d = tokens[3];
e = tokens[4];
} catch (Exception e1) {
}
System.out.println("String is : " + line);
// Sample validation
if (a.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+")) {
System.out.println("Position First Matches.");
} else {
System.out.println("Error in first position.");
e = d;
d = c;
c = b;
b = a;
}
if (!(b.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+"))) {
System.out.println("Position Two Matches.");
} else {
System.out.println("Error in second position.");
e = d;
d = c;
c = b;
}
if (c.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+")) {
System.out.println("Position Three Matches.");
} else {
System.out.println("Error in third position.");
e = d;
d = c;
}
if (!(d.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+"))) {
System.out.println("Position Four Matches.");
} else {
System.out.println("Error in fourth position.");
e = d;
}
if (e.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+")) {
System.out.println("Position Five Matches.");
} else {
System.out.println("Error in fifth position.");
e = d;
d = c;
}
}
}
答案 1 :(得分:0)
我会尝试以下方法:
答案 2 :(得分:0)
这是星期六!让我们为您编写一个方法,假设模式为<number> <2char> <number> <a_word> <number>
,您可以更改模式。这很简单。
public static boolean validate(String line){
String delimiter = "[\\s]+";
String[] tokens = line.split(delimiter);
int i=0;
for(String s: tokens){
switch (i) {
case 0:
if(!s.matches("\\d+")) throw new IllegalArgumentException("First element missing");
break;
case 1:
if(!s.matches("\\w{2}")) throw new IllegalArgumentException("2nd element missing");
break;
case 2:
if(!s.matches("\\d+")) throw new IllegalArgumentException("3rd element missing");
break;
case 3:
if(!s.matches("\\w+")) throw new IllegalArgumentException("4th element missing");
break;
case 4:
if(!s.matches("\\d+")) throw new IllegalArgumentException("5th element missing");
break;
}
i++;
}
if(i<4)throw new IllegalArgumentException((i+1)+" element missing");
return true;
}
如果你不符合我的口味,你宁愿返回false
我抛出异常的地方。
答案 3 :(得分:0)
对于这样的语法,我认为使用Scanner
会做得更好。例如(您需要检查方法名称,参数类型等)
String line = "120 US 1 ALASKA 4";
Scanner scanner = new Scanner(line);
scanner.useDelimiter(" +"); // set the field delimiter regex.
int value1, value2, value3;
PARSE:
try {
value1 = scanner.nextInt();
if (!scanner.next().equals("USA")) {
...
break PARSE; // or throw ...
}
value2 = scanner.nextInt();
if (!scanner.next().equals("ALASKA")) {
...
break PARSE; // or throw ...
}
value3 = scanner.nextInt();
} catch (NoSuchElementException ex) {
...
}
如果缺少其中一个字段,那么您将在预期整数的位置获得非整数(因此NoSuchElementException
)或其中一个调用next()
将返回错误的标记字符串,equals
测试将失败。