用于匹配文件名或文件类型的Java正则表达式

时间:2012-12-04 21:13:41

标签: java regex pattern-matching match

我正在尝试编写一个java正则表达式,其中我的应用程序应该限制正则表达式中提到的文件或文件类型的名称附加到电子邮件中。我开始像这样的正则表达式,

    .*\\.(?:jpeg|jpg)$.

这是对的吗?现在它不起作用(匹配)。另外,如果我想扩展此正则表达式,如何向此表达式添加新文件类型或文件名。比如说,我想在这个正则表达式中添加vcf文件类型,我应该怎么做?另外,如果我需要添加文件名,比如说附加abc.bmp,我应该在这个正则表达式中包含该文件名的方式和位置?非常感谢任何帮助,因为我是这个正则表达式的新手。

3 个答案:

答案 0 :(得分:3)

怎么样

if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) {
    // good
} else {
    // bad
}

我在m.buttners回答下阅读你的评论并提出以下建议:

List<String> allowedExtensions = loadExtensionsFromConfig(); // implement this
boolean isFileAllowed = false;
for (String extension : allowedExtensions) {
    if (fileName.endsWith(extension)) { // this is case sensitive!
        isFileAllowed = true;
        break;
    }
}

答案 1 :(得分:2)

它应该是这样的:

.*\\.(jpe?g)$

答案 2 :(得分:0)

它不匹配的原因只是最后的.。这会尝试匹配字符串结尾后的字符 。显然,这无法奏效。删除它,你应该没事。请注意,您可以将(?:jpeg|jpg)缩减为jpe?g

这并不是说正则表达式是解决这个问题的正确方法。我更喜欢jlordo的方法,只要有少量可能的文件扩展名。这只是为了让您知道正则表达式出错的地方。

请注意,.*$是多余的。如果您使用的是match,则无论如何都要求模式匹配整个字符串。在这种情况下,您不需要再次声明$。如果您使用find,则无论如何都不需要匹配任意字符串的部分内容,因此您可以省略.*

修改

在评论中讨论之后,如果你有一组允许的扩展,加上一组允许的特定文件名,这将是一般的正则表达式:

^(?:.*\\.(?:all|allowed|file|extensions)|all\\.allowed|file\\.names)$