我从来没有对正则表达式好,我似乎无法得到这个......
我试图匹配这些行的语句(这些是我正在阅读的文本文件中的两行)
Lname Fname 12.35 1
Jones Bananaman 7.1 3
目前我正在使用这个语句
reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]")
但它没有输入while语句。 当我删除while时,程序读取文本文件就好了。 代码段是:
private void initializeFileData(){
try {
Scanner reader = new Scanner(openedPath);
while(reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]")){
employeeInfo.add(new EmployeeFile(reader.next(), reader.next(), reader.nextDouble(), reader.nextInt(), new employeeRemove()));
}
for(EmployeeFile element: employeeInfo){
output.add(element);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
答案 0 :(得分:6)
将\s
字符类用于单词之间的空格:
while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]"))
<强>更新强>
根据Scanner
类的javadoc,默认情况下它使用空格分割它的标记。您可以使用useDelimiter(String pattern)
的{{1}}方法更改其使用的分隔符。
Scanner
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html
答案 1 :(得分:2)
从我所看到的(如果我错了,请纠正我,因为正则表达式似乎总是欺骗我的大脑:p),你没有正确处理空间。你需要使用\ s,而不仅仅是标准的''字符
编辑:对不起,\ s。别人打败了我:p答案 2 :(得分:0)
实际上
\w+
将为[Lname, Fname, 12, 35, 1]
抓住Lname Fname 12.35 1
。因此,您只需存储reader.nextLine()
,然后从那里提取所有正则表达式匹配。从那里,你可以抽象一点,例如:
class EmployeeFile {
.....
public EmployeeFile(String firstName, String lastName,
Double firstDouble, int firstInt,
EmployeeRemove er){
.....
}
public EmployeeFile(String line) {
//TODO : extract all the required info from the string array
// instead of doing it while reading at the same time.
// Keep input parsing separate from input reading.
// Turn this into a string array using the regex pattern
// mentioned above
}
}
答案 3 :(得分:0)
我创建了自己的版本,没有文件和最后一个循环,就是这样:
private static void initializeFileData() {
String[] testStrings = {"Lname Fname 12.35 1", "Jones Bananaman 7.1 3"};
Pattern myPattern = Pattern.compile("(\\w+)\\s+(\\w+)\\s+(\\d*\\.\\d{1,2})\\s+([0-5])");
for (String s : testStrings) {
Matcher myMatcher = myPattern.matcher(s);
if (myMatcher.groupCount() == 4) {
String lastName = myMatcher.group(1);
String firstName = myMatcher.group(2);
double firstValue = Double.parseDouble(myMatcher.group(3) );
int secondValue = Integer.parseInt(myMatcher.group(4));
//employeeInfo.add(new EmployeeFile(lastName, firstName, firstValue, secondValue, new employeeRemove()));
}
}
}
请注意,我删除了点之前的斜杠(您想要一个点,而不是任何字符)并插入括号,以便创建组。
我希望它有所帮助。