【问题标题】:How to extract the repeated part of string?如何提取字符串的重复部分?
【发布时间】:2018-11-07 14:10:05
【问题描述】:

我正在尝试使用 Java 正则表达式提取字符串的重复部分。

我的字符串是:s01e04:11:08

正则表达式为:^s(\\d+)e(\\d+)(:\\d+)*$

正则表达式匹配,但是当我尝试提取第三组时,它只返回它的最后一部分。

预期::11:08

得到::08

完整代码为:

public static void main( String args[] ) {
        String marker = "s01e04:11:08";
        Pattern r = Pattern.compile("^s(\\d+)e(\\d+)(:\\d+)*$");
        Matcher matcher = r.matcher(marker);

        if (matcher.find()) {
            System.out.println(matcher.group(3));
        }
    }
}

【问题讨论】:

    标签: java regex


    【解决方案1】:

    在重复周围添加一个捕获组:

    ^s(\\d+)e(\\d+)((:\\d+)*)$
                   ^        ^
    

    如果您不需要自己获取重复组,您也可以使重复组不被捕获:

    ^s(\\d+)e(\\d+)((?::\\d+)*)$
                     ^^
    

    【讨论】:

    • 感谢您的回答。据我了解,无论有多少包含组将在第一级组中。或者有什么方法可以获得一级组的嵌套子组之一?像 2D 数组索引 (group[1][2]) 这样的东西,在 Java 中不是必需的。
    • 我找到了答案。如果我们使用^s(\\d+)e(\\d+)(:\\d+)*$s01e04 匹配,我们将在获得3 组时得到null。如果与s01e04:11:08 匹配,我们将得到:08 - 第3 组的最后重复部分。如果我们将使用^s(\\d+)e(\\d+)((:\\d+)*)$,我们将在第一种情况下得到"",在第二种情况下得到:11:08。此外,使用第二个表达式,我们可以使用索引 4 引用第 3 组的最后一个重复片段(内部组)。如果我们想禁用引用第 4 组的能力,我们可以使用重复组非捕获表达式:^s(\\d+)e(\\d+)((?::\\d+)*)$
    【解决方案2】:

    您的模式与第一个“:”不匹配。

    尝试使用它。

    ("^s(\\d+)e(\\d+)((:\\d+)+)$")
    

    (:\\d+)+ 匹配 :dd 一次或多次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2022-01-18
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      相关资源
      最近更新 更多