我正在尝试获取第一组正则表达式模式。 我从歌词文本中得到了这个字符串:
[01:34][01:36]Blablablahh nanana
我使用这个正则表达式模式来提取 [01:34]、[03:36] 和文本。
Pattern timeLine = Pattern.compile("(\\[\\d\\d:\\d\\d\\])+(.*)");
但是当我尝试使用 group(1) 提取第一组 [01:34] 时,它返回 [03:36]
正则表达式模式有问题吗?
最佳答案
你的问题就在这里
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 中删除 (.*)
来实现此目的。
关于java - 我无法在java中获取第一组正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034938/