Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于验证正确ISO8601日期字符串的正则表达式_Java_Regex_Isodate - Fatal编程技术网

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");
    }