有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

涵盖多种日期格式的java正则表达式

选择什么正则表达式来覆盖以下所有场景: 基本上我必须提取前缀和后缀

前缀。YYYY-MM-DD-HH-MM-SS。后缀

YYYY-MM-DD是强制性的

HH-MM-SS是可选的。(可以是HH-only或HH-MM或HH-MM-SS)

样本:

“test1.2020-03-07-00.test.com”

“test2.2020-03-06-16.test2.test1.com”

“test3.2020-03-06-16-13-40.test2.test1.com”

“test4.2020-03-06-16-13.test.com”

“test5.ext.2020-03-11-17-57.test1.com”

“test6.ext.2020-03-11.test1.test2.test3.com”

我使用这个正则表达式,但它失败了:

Pattern.compile(".\\d{4}-\\d{2}-\\d{2}(-\\d{2}-\\d{2}-\\d{2})?.*?");

共 (1) 个答案

  1. # 1 楼答案

    首先请记住.句点是一个特殊的正则表达式模式,它匹配任何字符,所以要特别匹配句点,需要将其转义为\.

    你自己说过时间部分可以是HH only或HH-MM或HH-MM-SS,所以你不应该期望(-\\d{2}-\\d{2}-\\d{2})?与之匹配。因为您不需要捕获它,所以使用(?:...)非捕获组,并将它们嵌套:(?:-\\d{2}(?:-\\d{2}(?:-\\d{2})?)?)?。更好的是,因为这三个部分是相同的,所以使用(?:-\\d{2}){0,3}

    你说“我必须提取前缀和后缀”,所以你应该将其添加到模式中

    Pattern p = Pattern.compile("^(.*?)\\.(\\d{4}(?:-\\d{2}){2,5})\\.(.*)$");
    for (String s : new String[] { "test1.2020-03-07-00.test.com",
                                   "test2.2020-03-06-16.test2.test1.com",
                                   "test3.2020-03-06-16-13-40.test2.test1.com",
                                   "test4.2020-03-06-16-13.test.com",
                                   "test5.ext.2020-03-11-17-57.test1.com",
                                   "test6.ext.2020-03-11.test1.test2.test3.com" }) {
        Matcher m = p.matcher(s);
        if (m.matches()) {
            System.out.printf("prefix = '%s', date = '%s', suffix = '%s'%n",
                              m.group(1), m.group(2), m.group(3));
        } else {
            System.out.printf("NO MATCH: '%s'%n", s);
        }
    }
    

    输出

    prefix = 'test1', date = '2020-03-07-00', suffix = 'test.com'
    prefix = 'test2', date = '2020-03-06-16', suffix = 'test2.test1.com'
    prefix = 'test3', date = '2020-03-06-16-13-40', suffix = 'test2.test1.com'
    prefix = 'test4', date = '2020-03-06-16-13', suffix = 'test.com'
    prefix = 'test5.ext', date = '2020-03-11-17-57', suffix = 'test1.com'
    prefix = 'test6.ext', date = '2020-03-11', suffix = 'test1.test2.test3.com'