非捕获组 Java 正则表达式

3

我看到了这篇文章 什么是非捕获组?问号后跟着冒号(?:)代表什么意思?

我发现以下代码可能有效,但实际上并不行...

我有一个字符串"Game No : 432543254 \n"

Pattern p = Pattern.compile("(?:Game No : )[0-9]*?(\n)");
Matcher m = p.matcher(curr);
m.find();
System.out.print(m.group());

但是上面的代码打印了整个字符串,而不仅仅是我想要的数字。

1
它打印整个字符串是因为你告诉它这样做。m.group()指的是整个匹配。如果你只对匹配文本的一部分感兴趣,可以使用捕获组,例如 Game No : ([0-9]*) 然后 print(m.group(1)) - Aran-Fey
仅仅因为Game No在非捕获组中,并不意味着它不是匹配的一部分。如果你想要将其排除在匹配之外,你需要使用向后查找。 - Gerrit0
你为什么认为它只应该打印数字? - Pshemo
你的正则表达式无法匹配字符串 "Game No : 432543254 \n",因为它没有考虑到最后一个数字和换行符之间可能有空格。此外,非捕获分组 (?:Game No : ) 是不必要的,你为什么要使用它呢? - user557597
1个回答

3
一个非捕获组不会“捕获”,但仍然匹配字符串。此外,您的模式中数字和换行符之间有一个空格,因此它不会匹配。
要获取数字,您可以在数字匹配模式周围使用捕获组,如下所示:
Pattern p = Pattern.compile("Game No : ([0-9]+)");
Matcher m = p.matcher(curr);
if (m.find()) {
    System.out.print(m.group(1));
}

查看Java演示

或者,使用非正则表达式方案,只需使用:进行分割并获取结果数组的第二项并对其进行修整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接