当前位置: 首页 > 知识库问答 >
问题:

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

史宸
2023-03-14

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

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和小组中正确表达吗?

共有2个答案

席宜修
2023-03-14

下面是一个使用原始正则表达式的解决方案,经过修改,它实际上返回了您想要的组:

String content = "startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]";
Pattern pattern = Pattern.compile("([a-zA-Z_0-9]*):(\\[(?:\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z|\\*):(?:\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z|\\*)\\])");
Matcher matcher = pattern.matcher(content);
// remember to call find() at least once before trying to access groups
matcher.find();

System.out.println("group1 = " + matcher.group(1));
System.out.println("group2 = " + matcher.group(2));

输出:

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

这段代码已经在IntelliJ上测试过,看起来工作正常。

魏朗
2023-03-14

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

例如,以下代码适用于我:

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

为了简化事情,我只使用年份,但我相信它会与完整的时间戳字符串一起工作。

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

请注意,我使用预定义的字符类简化了一些regexp。看见http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html更多细节。

 类似资料:
  • 问题内容: 我已经努力了两天才能使它正常工作,但我做不到(对正则表达式:S太糟糕了)。 从本文中,我需要检索两个不同的东西:和。为此,我创建了此正则表达式: 在该示例中,它可以工作。但是,如果我尝试其他文本:,则只会得到一个包含2个分组的匹配:和,而不是获得2个不同的匹配:一个具有分组和,另一个具有分组和。 我希望你能帮助我。 提前致谢。 问题答案: 这是为什么组合可能是邪恶的经典示例。请改用否定

  • 我在一个c程序中有以下文本字符串和regex模式: 多谢了。

  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

  • 我知道使用regex来解析html是不可取的,但这是我想先尝试的解决方案。 我正在努力匹配 以及这些单词之间的任何字符或空格 在以下字符串中: 我使用的正则表达式是: 我知道答案?在'is'阻止我的正则表达式与最后一个p标记中的'How is'匹配之前。但我不知道应该在开头放什么来阻止比赛从第一个p标签的“发生了什么”开始 我正在查看来自https://regex101.com/r/kZWYR7/

  • 问题内容: 给出以下Java表达式代码: 如果是,则表示正则表达式匹配整个“行”。那我可以得到两组的内容吗?每个是? 问题答案: 要访问组,您需要使用:。 然后,您可以调用或在匹配器上执行匹配器,如果匹配器返回true,则可以通过和访问组。