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

标签 java regex

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

[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/

相关文章:

java - 如何将请求从 web1/servlet 转发到 web2/servlet?

java - 如何更改tomcat的上下文路径?

java - 定制坚果

javascript - 如何使用 .every() 方法验证针对 Regex 的输入?

html - 正则表达式 VBA 匹配

java - 查找具有特定模式但尚未在列表中找到的字符串(Java 正则表达式)

java - 如何测试绘制到 Canvas 的方法?

java - 如何修复:Azure Cosmos DB SQL API似乎不起作用

Python:删除包括一行中某个字符之后的所有内容

regex - 如何捕获多个重复组?