【问题标题】:Java regular expression for matching filenames or filetypes用于匹配文件名或文件类型的 Java 正则表达式
【发布时间】:2012-12-04 21:13:40
【问题描述】:

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

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

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

【问题讨论】:

  • 你能把代码显示在你使用它的地方吗?
  • 你用什么发送邮件?这是 Web 应用程序还是 Swing o SWT 应用程序?
  • @user1867196 查看我编辑的答案。

标签: java regex pattern-matching match


【解决方案1】:

怎么样

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;
    }
}

【讨论】:

    【解决方案2】:

    应该是这样的:

    .*\\.(jpe?g)$
    

    【讨论】:

      【解决方案3】:

      它不匹配的原因只是最后的.。这会尝试匹配字符串末尾 之后的字符。这显然行不通。删除它,你应该没问题。请注意,您可以将(?:jpeg|jpg) 减少为jpe?g

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

      请注意,.*$ 都是多余的。如果您使用match,则无论如何都需要模式匹配整个字符串。在这种情况下,您不需要再次断言$。如果你使用find,那么你不需要匹配任意的字符串部分,所以你可以省略.*

      编辑:

      经过 cmets 的讨论,如果你有一组允许的扩展名,加上一组允许的特定文件名,这就是通用的正则表达式:

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

      【讨论】:

      • 我不能在这里使用 jlordo 的方法,因为没有我事先知道的特定文件类型集。这将是一个可配置的正则表达式,客户端(用户)将使用它来提及他们想要过滤的文件名或文件类型。我的 java 代码应该从属性文件中获取可配置的正则表达式,并将当前文件名或文件类型与正则表达式匹配,以检查是否有任何匹配。我在这里使用 $ 来表示行尾。所以现在如果我需要添加更多文件扩展名(bmp,vcf..)或文件名(abc.txt),你能告诉我我需要遵循的格式吗?
      • @user1867196 像^(?:.*\\.(?:all|allowed|file|extensions)|all\\.allowed|file\\.names)$,我想?
      • @user1867196 请考虑接受答案,以向未来的访问者展示您的问题已解决(以及如何解决)
      猜你喜欢
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多