用于验证正确的 ISO8601 日期字符串的正则表达式

Bag*_*rat 3 java regex isodate

例如:2013-08-11T17:22:04.51+01:00

在此stackoverflow 答案中,涵盖了不带.51部分的ISODateTime 。

请帮助纠正这个正则表达式

^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:Z|[+-][01]\d:[0-5]\d)$
Run Code Online (Sandbox Code Playgroud)

处理我的格式。

Emm*_*mma 5

使用捕获组,您可以简单地设计一个表达式来捕获您希望从输入中捕获的任何内容。例如这个表达式

(\d{4}-\d{2}-\d{2})[A-Z]+(\d{2}:\d{2}:\d{2}).([0-9+-:]+)
Run Code Online (Sandbox Code Playgroud)

将您的输入分为三个捕获组,您可以简单地使用 $1-$3 调用它们。

您还可以在 中添加您可能想要的任何字符[]

在此输入图像描述

正则表达式描述图

此图显示了表达式的工作原理,您可以在此链接中可视化其他表达式:

在此输入图像描述

Java测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(\\d{4}-\\d{2}-\\d{2})[A-Z]+(\\d{2}:\\d{2}:\\d{2}).([0-9+-:]+)";
final String string = "2013-08-11T17:22:04.51+01:00";
final String subst = "\\1 \\2 \\3";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);
Run Code Online (Sandbox Code Playgroud)

JavaScript 演示

(\d{4}-\d{2}-\d{2})[A-Z]+(\d{2}:\d{2}:\d{2}).([0-9+-:]+)
Run Code Online (Sandbox Code Playgroud)

基本性能测试

此 JavaScript 片段显示了使用简单的 100 万次for循环的表达式性能。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(\\d{4}-\\d{2}-\\d{2})[A-Z]+(\\d{2}:\\d{2}:\\d{2}).([0-9+-:]+)";
final String string = "2013-08-11T17:22:04.51+01:00";
final String subst = "\\1 \\2 \\3";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);
Run Code Online (Sandbox Code Playgroud)