首页 > 解决方案 > 处理两个不同文件扩展名的正则表达式

问题描述

我正在尝试创建一个正则表达式,它采用名称为“abcd_04-04-2020.txt”或“abcd_04-04-2020.txt.gz”的文件

如何处理扩展的“OR”条件。这是我到目前为止所拥有的

if(fileName.matches("([\\w._-]+[0-9]{2}-[0-9]{2}-[0-9]{4}.[a-zA-Z]{3})")){
    Pattern.compile("[._]+[0-9]{2}-[0-9]{2}-[0-9]{4}\\.");
}

这仅处理 .txt。我该如何处理“.txt.gz”谢谢

标签: javaregex

解决方案


您可以使用以下正则表达式来实现您的目的:

^[\w-]+\d{2}-\d{2}-\d{4}\.txt(?:\.gz)?$

上述正则表达式的解释: ]

^,$- 匹配测试字符串的开始和结束。

[\w-]+- 匹配单词字符和连字符一次或多次。

\d{}- 匹配花括号中提到的尽可能多的数字。

(?:\.gz)?.gz - 表示匹配零次或一次的非捕获组,因为?量词。您可以使用|交替(或您所期望的OR),但这也更清晰且更有效。

您可以在此处找到上述正则表达式的演示

正则表达式可视化

在 Java 中的实现:

import java.util.regex.*;
public class Main
{
    private static final Pattern pattern = Pattern.compile("^[\\w-]+\\d{2}-\\d{2}-\\d{4}\\.txt(?:\\.gz)?$", Pattern.MULTILINE);
    public static void main(String[] args) {
        String testString = "abcd_04-04-2020.txt\nabcd_04-04-2020.txt.gz\nsomethibsnfkns_05-06-2020.txt\n.txt.gz";
        Matcher matcher = pattern.matcher(testString);
        while(matcher.find()){
            System.out.println(matcher.group(0));
        }
    }
}

你可以在这里找到上述正则表达式在 java 中的实现

注意:如果您还想匹配有效日期;请访问此。


推荐阅读