Java 正则表达式语句

Java 正则表达式语句,java,regex,text-files,java.util.scanner,Java,Regex,Text Files,Java.util.scanner,我从来都不擅长正则表达式,我似乎无法得到这个 我试图沿着这些行匹配语句(我正在阅读的文本文件中有两行) 目前我使用这个语句已有一段时间了 reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]") 但是它没有进入while语句。 当我删除while时,程序可以很好地读取文本文件。 代码段如下所示: private void initializeFileData(){ try { Scanner reader = new Scann

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

我试图沿着这些行匹配语句(我正在阅读的文本文件中有两行)

目前我使用这个语句已有一段时间了

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

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

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

根据
Scanner
类的javadoc,默认情况下,它使用空格分割其令牌。您可以通过
Scanner
uselimiter(字符串模式)
方法更改它使用的分隔符

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]")){
        ...

使用
\s
字符类来表示单词之间的空格:

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

根据
Scanner
类的javadoc,默认情况下,它使用空格分割其令牌。您可以通过
Scanner
uselimiter(字符串模式)
方法更改它使用的分隔符

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]")){
        ...
从我所看到的(如果我错了,请纠正我,因为正则表达式似乎总是欺骗我的大脑:p),您没有正确处理空格。您需要使用\s,而不仅仅是标准的“”字符

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

编辑:对不起,\s。有人打败了我:事实上

\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

     }



}
实际上

\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

     }



}

我创建了自己的版本,没有文件和最后一个循环,如下所示:

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()));
            }
        }
    }
请注意,为了创建组,我删除了点之前的斜杠(您需要的是点,而不是任何字符),并插入了括号


我希望有帮助。

我创建了自己的版本,没有文件和最后一个循环,如下所示:

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()));
            }
        }
    }
请注意,为了创建组,我删除了点之前的斜杠(您需要的是点,而不是任何字符),并插入了括号


我希望它能有所帮助。

我之前试过,但没有成功,我还使用了您的代码进行了双重检查,但没有成功。我更改了它,因为我非常确定它应该与\\s或''一起工作。不管怎样,还是不行。嗯。。。那么,您是否需要为扫描器使用不同的分隔符,以便扫描器按换行符而不是空格分割令牌<代码>扫描仪阅读器=新扫描仪(openedPath)。使用分隔符(\\n”)我之前尝试过,但没有成功,我还使用了你的代码进行了双重检查,但没有成功。我更改了它,因为我非常确定它应该与\\s或''一起工作。不管怎样,还是不行。嗯。。。那么,您是否需要为扫描器使用不同的分隔符,以便扫描器按换行符而不是空格分割令牌<代码>扫描仪阅读器=新扫描仪(openedPath)。使用分隔符(\\n”)