对Java正则表达式感到困惑

时间:2012-08-01 15:30:41

标签: java regex

我要做的是从目录中的文件列表中查看并查看哪个文件名具有“输出”模式。如果文件确实包含单词'output',那么我只想将其打印到屏幕上。就是这样。

这是我的代码不起作用。为什么不起作用?

package duplicate_search;

import java.io.File;
import java.util.regex.*;
import java.util.Scanner;

public class Search {
public static void main(String [] args){
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Enter the directory to search: ");
    String dir = keyboard.next();

    Pattern p = Pattern.compile("output");
    Matcher m = null;
    System.out.println
              ("Now search for *." + p + " files.");
    File folder = new File(dir);
    File[] listOfFiles = folder.listFiles();


    for(File f : listOfFiles){
        m = p.matcher(f.getName());
        if(m.matches()){
            System.out.println(f.getName());
        }
      }
    }
}

4 个答案:

答案 0 :(得分:3)

如果您想匹配包含"输出"的文件名,那么您不想使用matches,而是find

来自文档:

  

matches方法尝试将整个输入序列与模式匹配。

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

答案 1 :(得分:3)

.matches()完全匹配。检查.*output.*或使用find()

答案 2 :(得分:1)

为什么不使用contains()方法?除非我没有得到你的问题,你可以检查一个字符串是否包含该字符序列:

f.getName().contains("output"); //Returns true if the string contains "output"

恕我直言,除非你有理由,否则这里的正则表达似乎有些过分。

答案 3 :(得分:0)

以下是修改后的代码

import java.io.File;
import java.util.regex.*;
import java.util.Scanner;

public class Search {
public static void main(String [] args){
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Enter the directory to search: ");
    String dir = keyboard.next();

    Pattern p = Pattern.compile("output");
    Matcher m = null;
    System.out.println
              ("Now search for *." + p + " files.");
    File folder = new File(dir);
    File[] listOfFiles = folder.listFiles();


    for(File f : listOfFiles){
        m = p.matcher(f.getName());
        if(m.find()){ // change to find instead of m.matches()
            System.out.println(m.group()); // return the string sequence which is matched
        }
      }
    }
}