我无法在java中获得第一组正则表达式模式

时间:2013-11-17 19:11:20

标签: java regex

我正在尝试获得第一组正则表达式模式。 我从抒情文本中得到了这个字符串:

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

你的问题在这里

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组来实现它。

答案 1 :(得分:1)

我很瘦,你会被重复的匹配(\\[\\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

答案 2 :(得分:1)

我只想使用字符类抓取第一部分:

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

同样的文字:

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