Reputation: 187399
I'm trying to come up with a Java regex that will match a filename only if it has a valid extension. For example it should match "foo.bar" and "foo.b", but neither "foo." nor "foo".
I've written the following test program
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);
}
I expect this to print "true true false false", but instead it prints false for all 4 cases. Where am I going wrong?
Cheers, Don
Upvotes: 4
Views: 12411
Reputation: 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);
}
}
Upvotes: 0
Reputation: 62789
public boolean isFilename(String filename) {
int i=filename.lastInstanceOf(".");
return(i != -1 && i != filename.length - 1)
}
Would be significantly faster and regardless of what you do, putting it in a method would be more readable.
Upvotes: 8
Reputation: 400652
The Matcher.matches() function tries to match the pattern against the entire input. Thus, you have to add .*
to the beginning of your regex (and the \\Z
at the end is superfluous, too), or use the find() method.
Upvotes: 10