【问题标题】:I can't get the first group of regex pattern in java我无法在java中获得第一组正则表达式模式
【发布时间】:2013-11-30 20:16:32
【问题描述】:

我正在尝试获取第一组正则表达式模式。 我从歌词中得到了这个字符串:

[01:34][01:36]Blablablahh nanana

我是这个正则表达式模式来提取 [01:34],[03:36] 和文本。

Pattern timeLine = Pattern.compile("(\\[\\d\\d:\\d\\d\\])+(.*)");

但是当我尝试使用 group(1) 提取第一组 [01:34] 时,它返回 [03:36]

正则表达式模式有什么问题吗?

【问题讨论】:

标签: java regex


【解决方案1】:

你的问题来了

Pattern.compile("(\\[\\d\\d:\\d\\d\\])+(.*)");
                                      ^

这部分模式(\\[\\d\\d:\\d\\d\\])+ 将匹配[01:34][01:36],因为+(这是贪婪的),但您的组1 只能包含[dd:dd] 之一,因此它将存储找到的最后一个匹配项。

如果您只想找到 [01:34],您可以通过删除 + 来更正您的模式。但你也可以创建更简单的模式

Pattern.compile("^\\[\\d\\d:\\d\\d\\]");

并将其与group(0) 一起使用,group() 也调用它。

Pattern timeLine = Pattern.compile("^\\[\\d\\d:\\d\\d\\]");
Matcher m = timeLine.matcher("[01:34][01:36]Blablablahh nanana");
while (m.find()) {
    System.out.println(m.group()); // prints [01:34]
}

如果您想同时提取[01:34][01:36],您可以在当前的正则表达式中添加另一个括号,例如

Pattern.compile("((\\[\\d\\d:\\d\\d\\])+)(.*)");

这样(\\[\\d\\d:\\d\\d\\])+的整场比赛将在第1组。

您也可以通过从原始模式和阅读组 0 中删除 (.*) 来实现。

【讨论】:

    【解决方案2】:

    我认为你对重复匹配 (\\[\\d\\d:\\d\\d\\])+ 感到困惑,它只返回最后一个匹配作为组值。尝试以下方法,看看它是否对您更有意义:

        String s = "[01:34][01:36]Blablablahh nanana";
        Pattern timeLine = Pattern.compile("(\\[\\d\\d:\\d\\d\\])(\\[\\d\\d:\\d\\d\\])(.+)");
        Matcher m = timeLine.matcher(s);
        if (m.matches()) {
            for (int i = 1; i <= m.groupCount(); i++) {
                System.out.printf("    Group %d -> %s\n", i, m.group(i)); // prints [01:36]
            }
        }    
    

    对我来说返回:

    Group 1 -> [01:34]
    Group 2 -> [01:36]
    Group 3 -> Blablablahh nanana
    

    【讨论】:

      【解决方案3】:

      我会简单地使用字符类来获取第一部分:

      String timings = str.replaceAll("([\\[\\]\\d:]+).*", "$1");
      

      同样的文字:

      String text = str.replaceAll("[\\[\\]\\d:]+", "");
      

      【讨论】:

      • 我认为在你的第一个正则表达式中你想在最后使用).* :)。无论如何 +1 单线。
      • @Pshemo 是的,你是对的。感谢您修复它:)(也为您 +1 - 很好的解释)
      猜你喜欢
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      相关资源
      最近更新 更多