Я пытаюсь придумать регулярное выражение Java, которое будет соответствовать имени файла, только если оно имеет допустимое расширение. Например, он должен соответствовать «foo.bar» и «foo.b», но не «foo». ни "фу".
Я написал следующую тестовую программу
public static void main(String[] args) {
Pattern fileExtensionPattern = Pattern.compile("\\.\\w+\\z");
boolean one = fileExtensionPattern.matcher("foo.bar").matches();
boolean two = fileExtensionPattern.matcher("foo.b").matches();
boolean three = fileExtensionPattern.matcher("foo.").matches();
boolean four = fileExtensionPattern.matcher("foo").matches();
System.out.println(one + " " + two + " " + three + " " + four);
}
Я ожидаю, что это напечатает «true true false false», но вместо этого он печатает false для всех 4 случаев. Где я ошибаюсь?
Ваше здоровье, Дон




Функция Matcher.matches () пытается сопоставить шаблон со всем вводом. Таким образом, вам нужно добавить .* в начало вашего регулярного выражения (и \\Z в конце тоже лишний) или использовать метод найти().
public boolean isFilename(String filename) {
int i=filename.lastInstanceOf(".");
return(i != -1 && i != filename.length - 1)
}
Будет значительно быстрее, и независимо от того, что вы делаете, добавление его в метод будет более читабельным.
package regularexpression;
import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularFile {
public static void main(String[] args) {
new RegularFile();
}
public RegularFile() {
String fileName = null;
boolean bName = false;
int iCount = 0;
File dir = new File("C:/regularfolder");
File[] files = dir.listFiles();
System.out.println("List Of Files ::");
for (File f : files) {
fileName = f.getName();
System.out.println(fileName);
Pattern uName = Pattern.compile(".*l.zip.*");
Matcher mUname = uName.matcher(fileName);
bName = mUname.matches();
if (bName) {
iCount++;
}
}
System.out.println("File Count In Folder ::" + iCount);
}
}
Спасибо за ответ! Хотя фрагмент кода может ответить на этот вопрос, все же здорово добавить дополнительную информацию, например, объяснить и т. д.
Кроме того, Дон мог бы подумать о том, чтобы обернуть свое регулярное выражение в FileFilter: java.sun.com/j2se/1.4.2/docs/api/java/io/FileFilter.html