用连字符分隔的Java日期模式

用连字符分隔的Java日期模式,java,regex,Java,Regex,我想知道这是否是匹配字符串的正确模式,如下所示 字符串样本 23.04.2019-30.04.2019 3.06.2019-20.06.2019 图案 private final Pattern TIMELINE_PATTERN = Pattern.compile("^\\d{2}.\\d{2}.\\d{4}-\\d{2}.\\d{2}.\\d{4}$"); 当前正则表达式中有两个问题 第一个量词必须是{1,2},而不仅仅是{2},才能支持一位或两位数字 你得逃开点 您需要使用的正确正则

我想知道这是否是匹配字符串的正确模式,如下所示

字符串样本

23.04.2019-30.04.2019
3.06.2019-20.06.2019
图案

private final Pattern TIMELINE_PATTERN = Pattern.compile("^\\d{2}.\\d{2}.\\d{4}-\\d{2}.\\d{2}.\\d{4}$");

当前正则表达式中有两个问题

  • 第一个量词必须是
    {1,2}
    ,而不仅仅是
    {2}
    ,才能支持一位或两位数字
  • 你得逃开点
您需要使用的正确正则表达式应该是

^\d{1,2}\.\d{2}\.\d{4}-\d{2}\.\d{2}\.\d{4}$

Java代码

List<String> list = Arrays.asList("23.04.2019-30.04.2019", "3.06.2019-20.06.2019");

list.forEach(x -> {
    System.out.println(x + " --> " + x.matches("^\\d{1,2}\\.\\d{2}\\.\\d{4}-\\d{2}\\.\\d{2}\\.\\d{4}$"));
});

如果日/月组件可以是一位或两位字符,则应使用以下模式:

^\d{1,2}\.\d{1,2}\.\d{4}-\d{1,2}\.\d{1,2}\.\d{4}$

据推测,年份可能也不是固定宽度,但可能不太可能出现早于1000年的年份,因此我们可以将年份固定为4位数。此外,正则表达式模式中的文字点需要用反斜杠转义

编辑:

如果要首先验证字符串,然后分离两个日期,则考虑如下:

String input = "3.06.2019-20.06.2019";
if (input.matches("\\d{1,2}\\.\\d{1,2}\\.\\d{4}-\\d{1,2}\\.\\d{1,2}\\.\\d{4}")) {
    String[] dates = input.split("-");
    System.out.println("date1: " + dates[0]);
    System.out.println("date2: " + dates[1]);
}

已经有了用于此的日期实用程序,但显然没有。第二个示例不是以两个数字开头的。您可能还希望转义
,否则它将匹配任何字符。也许还有其他问题,但这些是最明显的。@Reimeus你能给我指出一些吗。感谢令人沮丧的是,这两个日期中的任何一天都可能是1/2位数。而且,
String#matches
隐式地在模式周围放置锚,因此在代码中使用
^
$
是多余的。@TimBiegeleisen:我的正则表达式用于他给出的数据。但是,如果其他字段可以有一个或两个数字,那么我们也可以在那里使用
{1,2}
。先生,还有什么方法可以提取同一个字段中用连字符分隔的两个日期吗operation@SaurabhKumar检查我的最新答案。在使用当前正则表达式进行验证后,您可以使用
String#split
提取这两个日期。谢谢先生。完美的
String input = "3.06.2019-20.06.2019";
if (input.matches("\\d{1,2}\\.\\d{1,2}\\.\\d{4}-\\d{1,2}\\.\\d{1,2}\\.\\d{4}")) {
    String[] dates = input.split("-");
    System.out.println("date1: " + dates[0]);
    System.out.println("date2: " + dates[1]);
}