2016-10-02 5 views
1

Я написал программу для печати файлов с расширением doc или pdf. Но это не работает. Такое же регулярное выражение работает с прямыми именами файлов, а не с именами файлов, извлекаемых из файловой системы, и работает. , что случилось:java io - регулярные выражения не работают - Почему

import static java.nio.file.FileVisitResult.CONTINUE; 
import java.io.IOException; 
import java.nio.file.FileSystems; 
import java.nio.file.FileVisitResult; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.PathMatcher; 
import java.nio.file.Paths; 
import java.nio.file.SimpleFileVisitor; 
import java.nio.file.attribute.BasicFileAttributes; 

public class FindDuplicateFiles { 

    public static void main(String[] args) throws IOException { 

     String startingDirStr ="/Users/ravi/documents/LATEST SOURCE";//"."; 
     String pattern ="([^\\s]+(\\.(?i)(doc|docx|pdf))$)";//"*.doc*";//"((\\.(?i)(pdf|doc))$)";//"^(?:.*\\.(?:docx|pdf)$";// ".*\\.(?:doc|pdf)$";// 

     Path startingDir = Paths.get(startingDirStr); 

     Finder finder = new Finder(pattern); 
     Files.walkFileTree(startingDir, finder); 
     finder.done(); 
    } 

    public static class Finder extends SimpleFileVisitor<Path> { 

     private final PathMatcher matcher; 
     private int numMatches = 0; 

     Finder(String pattern) { 
      matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); 
     } 

     // Compares the glob pattern against 
     // the file or directory name. 
     void find(Path file) { 
      Path name = file.getFileName(); 
      if (name != null && matcher.matches(name)) { 
       numMatches++; 

       System.out.println(name); 
       //System.out.println(file); 
      } 
     } 

     // Prints the total number of 
     // matches to standard out. 
     void done() { 
      System.out.println("Matched: " + numMatches); 
     } 

     // Invoke the pattern matching 
     // method on each file. 
     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { 
      find(file); 
      return CONTINUE; 
     } 

     // Invoke the pattern matching 
     // method on each directory. 
     @Override 
     public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { 
      find(dir); 
      return CONTINUE; 
     } 

     @Override 
     public FileVisitResult visitFileFailed(Path file, IOException exc) { 
      System.err.println(exc); 
      return CONTINUE; 
     } 
    } 

} 

Но это работает отлично:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class FindDocuments { 

    private Pattern pattern; 
    private Matcher matcher; 

    private static final String IMAGE_PATTERN = "([^\\s]+(\\.(?i)(doc|docx|pdf))$)"; 

    public FindDocuments() { 
     pattern = Pattern.compile(IMAGE_PATTERN); 
    } 

    public boolean validate(final String image) { 

     matcher = pattern.matcher(image); 
     return matcher.matches(); 

    } 

    public static void main(String[] args) { 
     FindDocuments fd = new FindDocuments(); 
     String[] aaa = new String[] { "a.doc", "a.docx", "a.pdf", "a.PDF", "..DOC", "..PDF" }; 
     for (String temp : aaa) { 
      boolean valid = fd.validate(temp); 
      System.out.println("Image is valid : " + temp + " , " + valid); 

     } 

    } 
} 

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^