我正在尝试获得第一组正则表达式模式。 我从抒情文本中得到了这个字符串:
[01:34][01:36]Blablablahh nanana
我是这个正则表达式模式来提取[01:34],[03:36]和文本。
Pattern timeLine = Pattern.compile("(\\[\\d\\d:\\d\\d\\])+(.*)");
但是当我尝试使用组(1)提取第一组[01:34]时,它返回[03:36]
正则表达式模式有问题吗?
答案 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:]+", "");