gpt4 book ai didi

java - 正则表达式未捕获预期组中的匹配项

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:23 26 4
gpt4 key购买 nike

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

startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]

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

startDate:[*;2016-10-12T12:23:23Z]
startDate:[2016-10-12T12:23:23Z;*]
startDate:[*;*]
上面表达式中的

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]]\\]])");

模式匹配但创建的组不是我所期望的。我想要用下面的括号括起来的组:

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

group1 = "startDate"
group2 = "[*;2016-10-12T12:23:23Z]"

你能帮我正确地用 Java 和组表达吗?

最佳答案

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

例如,下面的代码对我有用:

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

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

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

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

关于java - 正则表达式未捕获预期组中的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39910146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com