带.*的Java正则表达式组与普通正则表达式组

带.*的Java正则表达式组与普通正则表达式组,java,regex,regex-greedy,Java,Regex,Regex Greedy,我试图使用正则表达式来抓取一个完整字符串中的两个片段。我的正则表达式工作得很好 下面是一个示例字符串: Regex is fun when it works 99 这是我的正则表达式 (.*)\\s+(\\d+)$ 这些是我在使用Java的matcher(matches())和模式时得到的组: 1: Regex is fun when it works 99 2: Regex is fun when it works 使用普通正则表达式(在RegExr上),我得到了我实际期望的结果: 1:

我试图使用正则表达式来抓取一个完整字符串中的两个片段。我的正则表达式工作得很好

下面是一个示例字符串:

Regex is fun when it works 99
这是我的正则表达式

(.*)\\s+(\\d+)$

这些是我在使用Java的matcher(matches())和模式时得到的组:

1: Regex is fun when it works 99
2: Regex is fun when it works
使用普通正则表达式(在RegExr上),我得到了我实际期望的结果:

1: Regex is fun when it works
2: 99
在将正则表达式放入Java时,我需要注意哪些注意事项?我已经为特殊字符设置了\\。也许有一个诀窍可以使用

如果要复制和粘贴示例应用程序,请执行以下操作:

String str = "Regex is fun when it works 33";
String regx = "(.*)\\s+(\\d+)$"

Pattern p = Pattern.compile(regx);
Matcher m = p.matcher(str);

if (m.matches()) {
   for (int i = 0; i < m.groupCount(); i++) {
      System.out.println(i + ": " + m.group(i));
   }
}
String str=“Regex工作时很有趣”;
字符串regx=“(.*)\\s+(\\d+)”
Pattern p=Pattern.compile(regx);
匹配器m=p.Matcher(str);
如果(m.matches()){
对于(int i=0;i
将第一次捕获更改为非贪婪,如下所示:

(.*?)\\s+(\\d+)$

请参阅中的“小心贪婪”,但简单地说,后面的
会使前面的
*
量词变懒。也就是说,它将尽早停止使用字符。

您没有获得预期的
99
的原因是整个匹配
组(0)
未计入
groupcount()
,因此
for
循环退出得太早


因此,如果您将
i
更改为
i-Hey-Sepster,感谢您的快速回答和更高效的正则表达式!这个懒惰的正则表达式更适合我想要捕获的内容。它似乎也有更好的性能,但这只是一个假设:)结合MikeM的答案,我已经解决了这个问题!非常感谢。嗨,迈克,啊,它一直藏在那里。我觉得自己像个白痴!一定是生锈了。感谢您指出解决方案:)