1

我从来都不擅长正则表达式,我似乎无法得到这个......

我正在尝试按照这些行匹配语句(这是我正在阅读的文本文件中的两行)

Lname Fname 12.35 1
Jones Bananaman 7.1 3

目前我正在使用这个while语句

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();
    }
}
4

4 回答 4

6

对单词之间的空格使用\s字符类:

while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]"))

更新:

根据Scanner该类的 javadoc,默认情况下它使用空格分割它的标记。您可以使用 的useDelimiter(String pattern)方法更改它使用的分隔符Scanner

private void initializeFileData(){
    try {
        Scanner reader = new Scanner(openedPath).useDelimiter("\\n");
        ...
        while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]")){
        ...

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

于 2012-06-12T17:36:44.473 回答
2

从我所看到的(如果我错了,请纠正我,因为正则表达式似乎总是欺骗我的大脑:p),你没有正确处理空格。您需要使用 \s,而不仅仅是标准的 ' ' 字符

编辑:对不起,\s。别人打败了我:p

于 2012-06-12T17:37:53.627 回答
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

     }



}
于 2012-06-12T17:59:32.400 回答
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()));
            }
        }
    }

请注意,我删除了点之前的斜杠(您需要一个点,而不是任何字符)并插入括号,以创建组。

我希望它有所帮助。

于 2012-06-12T18:07:07.037 回答