Java 用于只允许文件扩展名一次的Regex

Java 用于只允许文件扩展名一次的Regex,java,regex,Java,Regex,我的验证需要具有以下要求的正则表达式: 文件扩展名只能出现一次,例如。 myfile.pdf(有效) myfile.pdf.pdf(无效) 有效的文件扩展名是pdf,doc,docx: myfile.pdf(有效) myfile.doc(有效) myfile.txt(无效) 您能帮助我使用Java中的正则表达式吗。我建议单独检查需求。例如: public static void main(String[] args) throws Exception { String [] fi

我的验证需要具有以下要求的正则表达式:

  • 文件扩展名只能出现一次,例如。
    • myfile.pdf
      (有效)
    • myfile.pdf.pdf
      (无效)
  • 有效的文件扩展名是
    pdf
    doc
    docx
    • myfile.pdf
      (有效)
    • myfile.doc
      (有效)
    • myfile.txt
      (无效)

  • 您能帮助我使用Java中的正则表达式吗。

    我建议单独检查需求。例如:

    public static void main(String[] args) throws Exception {
        String [] fileNames = {"myfile.pdf","myfile.pdf.pdf","myfile.doc","myfile.txt","myfile.txt.doc"};         
        for(String fileName : fileNames){
            boolean valid = hasValidExtension(fileName) && noDuplicates(fileName);
            System.out.println(fileName+"\t" + (valid?"Valid":"Invalid"));
        }
    }
    
    public static boolean hasValidExtension(String fileName){
        String ext = fileName.split("\\.(?=[^\\.]+$)")[1];
        if(ext.equals("pdf")||ext.equals("doc")||ext.equals("docx")){
            return true;
        }
        return false;
    }
    
    public static boolean noDuplicates(String fileName){
        String[] splited = fileName.split("\\.");
        Set<String> set = new HashSet<>();
        for (String str : splited) {
            if (set.add(str) == false) {
               return false;
            }
        }
        return true;
    }
    
    publicstaticvoidmain(字符串[]args)引发异常{
    字符串[]文件名={“myfile.pdf”、“myfile.pdf.pdf”、“myfile.doc”、“myfile.txt”、“myfile.txt.doc”};
    for(字符串文件名:文件名){
    boolean valid=hasValidExtension(文件名)&&noDuplicates(文件名);
    System.out.println(文件名+“\t”+(有效?:“无效”);
    }
    }
    公共静态布尔值hasValidExtension(字符串文件名){
    字符串ext=fileName.split(“\\.(?=[^\\.]+$)”[1];
    if(ext.equals(“pdf”)| | ext.equals(“doc”)| | ext.equals(“docx”)){
    返回true;
    }
    返回false;
    }
    公共静态布尔节点副本(字符串文件名){
    String[]splited=fileName.split(\\);
    Set=newhashset();
    for(字符串str:splited){
    if(set.add(str)==false){
    返回false;
    }
    }
    返回true;
    }
    
    类似myFile.txt.pdf的内容是否匹配?它有两个扩展,但只有一个是有效的。您尝试了什么?失败在哪里?我们不是代码编写服务,请阅读有关提问的指导。是的,myFile.txt.pdf将匹配。是否
    pdf.pdf
    有效?我认为第一个
    pdf
    不是一个扩展。我已经尝试了
    ([^\s]+(\.(?I)(pdf | doc | docx))$)
    ,但它只验证了2)