正则表达式不捕获预期组中的匹配

Vis*_*hal 6 java regex regex-group

我一直在处理需求,我需要在以下字符串上创建一个正则表达式:

startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]
Run Code Online (Sandbox Code Playgroud)

这个字符串可以有很多变化,如下所示:

startDate:[*;2016-10-12T12:23:23Z]
startDate:[2016-10-12T12:23:23Z;*]
startDate:[*;*]
Run Code Online (Sandbox Code Playgroud)

startDate在上面的表达式中是一个键名,可以是endDate,updateDate等,这意味着我们不能在表达式中硬编码.密钥名称可以被接受为任何单词[a-zA-Z_0-9]*

我使用以下编译模式

Pattern.compile("([[a-zA-Z_0-9]*):(\\[[[\\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]];[[\\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]]\\]])");
Run Code Online (Sandbox Code Playgroud)

模式匹配,但创建的组不是我所期望的.我希望下面用括号括起来的组:

(startDate):([*:2016-10-12T12:23:23Z])

group1 = "startDate"
group2 = "[*;2016-10-12T12:23:23Z]"
Run Code Online (Sandbox Code Playgroud)

你能帮我在Java和小组中正确表达吗?

spr*_*ter 4

您正在使用[而不是(包装选项(即使用|)。

例如,以下代码对我有用:

Pattern pattern = Pattern.compile("(\\w+):(\\[(\\*|\\d{4}):\\*\\])");
Matcher matcher = pattern.matcher(text);
if (matcher.matches()) {
    for (int i = 0; i < matcher.groupCount() + 1; i++) {
        System.out.println(i + ":" + matcher.group(i));
    }
} else {
    System.out.println("no match");
}
Run Code Online (Sandbox Code Playgroud)

为了简化事情,我只使用年份,但我确信它可以使用完整的时间戳字符串。

此表达式捕获的内容超出了您在组中所需的内容,但您可以使用该构造使它们“非捕获” (?: )

请注意,我使用预定义的字符类简化了一些正则表达式。有关更多详细信息,请参阅http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html 。