写一个简单的正则表达式,但我从来都不是很擅长这个。
我要做的是检查字符串(文件名)以确保它只包含az,AZ,0-9或特殊字符下划线(_)句点(。)或短划线( - )。
这就是我所拥有的
if(filename.length() < 1 || !filename.matches("^[a-zA-Z0-9[.][_][-]]+"))
return false;
else
return true;
这似乎有效,但对我来说看起来并不优雅。是否有更好/更易读的方式来写这个?
提前致谢!只是想学习如何更好地编写这些bugger。
- 将会
答案 0 :(得分:10)
您不需要在字符类中使用[]
。
所以,你可以写:
^[-a-zA-Z0-9._]+
此外,您可以使用\\w
代替a-zA-Z0-9_
。
所以,正则表达式将是:
^[-\\w.]+
此外,此正则表达式将使用StackOverflow 22.10$$2011
与StackOverflow 22.10
之类的字符串匹配。如果你需要你的字符串完全由这些字符组成,你应该用$
结束模式 - 字符串的结尾:
^[-\\w.]+$
答案 1 :(得分:1)
try {
boolean foundMatch = subjectString.matches("^[\\w.-]+$");
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
试试这个。
基本上\ w是[a-zA-Z_0-9]的简写,我只需添加你想要的其他两个字符。
答案 2 :(得分:0)
这是一种更昂贵的方法(因为它实际上触及了磁盘),但它将是跨平台的。
本质上,它创建一个具有给定名称的文件,如果以前不存在则删除它。如果您尝试使用无效名称创建文件,则会引发错误。因此,无论您使用何种系统,它都会告诉您文件名是否正确。
现在它违反了一般规则(使用异常来确定程序流),并且确实具有转到磁盘的缺点。但这是一种不同的方法,可能会给你一些可以使用的想法。
public boolean isValidFileName(final String fileName) {
final File file = new File(fileName);
final boolean isValid = true;
try {
if (file.createNewFile()) {
file.delete();
}
} catch (IOException e) {
isValid = false;
}
return isValid;
}