Java Regex a-z,A-Z,0-9和(。)(_)( - )

时间:2011-10-21 22:33:00

标签: java regex

写一个简单的正则表达式,但我从来都不是很擅长这个。

我要做的是检查字符串(文件名)以确保它只包含az,AZ,0-9或特殊字符下划线(_)句点(。)或短划线( - )。

这就是我所拥有的

if(filename.length() < 1 || !filename.matches("^[a-zA-Z0-9[.][_][-]]+"))
   return false;
else
   return true;

这似乎有效,但对我来说看起来并不优雅。是否有更好/更易读的方式来写这个?

提前致谢!只是想学习如何更好地编写这些bugger。

- 将会

3 个答案:

答案 0 :(得分:10)

您不需要在字符类中使用[]

所以,你可以写:

^[-a-zA-Z0-9._]+

此外,您可以使用\\w代替a-zA-Z0-9_

所以,正则表达式将是:

^[-\\w.]+

此外,此正则表达式将使用StackOverflow 22.10$$2011StackOverflow 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;
}