Java 用于验证正确ISO8601日期字符串的正则表达式
例如:Java 用于验证正确ISO8601日期字符串的正则表达式,java,regex,isodate,Java,Regex,Isodate,例如:2013-08-11T17:22:04.51+01:00 在本封面中,ISODateTime不含.51部分 请帮助更正此正则表达式 以下代码::(::0[1-9[1-1-9]1[1-9]1[0-2[0-0-2])-((以下以下代码::::::::::[1-1-9[1-9[1-1-9[1-9[1-1-9[1-1-9]1-9[1-9[1-9]1\d\124扑扑扑上述上述上述上述:::::::::::::[3[1-3[1-9[1-9[1-9[1-9[1-9]3-9 5 5 5 5 5 5 5 5
2013-08-11T17:22:04.51+01:00
在本封面中,ISODateTime不含.51部分
请帮助更正此正则表达式
以下代码::(::0[1-9[1-1-9]1[1-9]1[0-2[0-0-2])-((以下以下代码::::::::::[1-1-9[1-9[1-1-9[1-9[1-1-9[1-1-9]1-9[1-9[1-9]1\d\124扑扑扑上述上述上述上述:::::::::::::[3[1-3[1-9[1-9[1-9[1-9[1-9]3-9 5 5 5 5 5 5 5 5 5 5 5[3-3[3-3-5 5 5 5[3-3[3-3-3[3[3-3-9存存存存存存存存存存存存存存存存存存存3[3[3[3[3[3[3[3-3[3[3-5 5|2[0-3]:[0-5]\d:[0-5]\d(?:Z |[+-][01]\d:[0-5]\d)$
处理我的格式。此正则表达式应执行以下操作:
^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
参考使用捕获组,您可以简单地设计一个表达式,从输入中捕获您想要的任何内容。比如说, 将您的输入分为三个捕获组,您可以使用$1-$3简单地调用它们 您还可以在
[]
中添加您想要的任何字符
正则描述图
此图显示了表达式的工作方式,您可以通过以下方式可视化其他表达式:
Java测试
JavaScript演示
const regex=/(\d{4}-\d{2}-\d{2})[A-Z]+(\d{2}:\d{2}:\d{2})。([0-9+-:]+)/gm;
const str=`2013-08-11T17:22:04.51+01:00`;
const subst=`\n组1:$1\n组2:$2\n组3:$3\n`;
//被替换的值将包含在结果变量中
const result=str.replace(regex,subst);
log('替换结果:',结果)代码>正则表达式有时很方便,但通常很难阅读,也很难调试。Java内置了ISO 8601格式的解析和验证功能,它接受带小数和不带小数的字符串,如.51
。我理解您的要求,因为您需要通过javax.validation进行验证,这需要一个正则表达式。因此,只有对其他读者:选择是显而易见的:不要在这里使用正则表达式
try {
OffsetDateTime.parse("2013-08-11T17:22:04.51+01:00");
System.out.println("Valid ISO 8601");
} catch (DateTimeParseException e) {
System.out.println("Not valid ISO 8601");
}
有效ISO 8601
警告:OffsetDateTime.parse
仍然不接受ISO 8601的所有变体,但比正则表达式接受的变体要多得多。当您可以尝试将其解析为zoneDateTime
时,为什么要使用正则表达式来处理类似的事情呢?谢谢您的建议@Jacob G,但是我应该用javax.validation.Thank@ibiza it is works验证属性的值。[\+-]的目的是什么?
一开始是什么?和(?!\d{2}\b)
。。。当然,这是正确的答案。
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);
try {
OffsetDateTime.parse("2013-08-11T17:22:04.51+01:00");
System.out.println("Valid ISO 8601");
} catch (DateTimeParseException e) {
System.out.println("Not valid ISO 8601");
}