5

我正在学习 java OCP,目前我一直在理解“捕获组”部分。这是一种过于抽象的描述。您能否(如果您有时间)给我一些使用“捕获组”的真实示例?

有人可以为我提供以下陈述的具体示例吗?

捕获组是一种将多个字符视为一个单元的方法。它们是通过将要分组的字符放在一组括号内来创建的。例如,正则表达式 (dog) 创建一个包含字母“d”、“o”和“g”的组。与捕获组匹配的输入字符串部分将保存在内存中,以供以后通过反向引用调用(如下面的反向引用部分所述)。

我很确定只要我看到一个具体的例子,我就会明白。

提前致谢。

4

5 回答 5

13

除其他外,正则表达式允许您获取与正则表达式的各个部分匹配的输入部分。有时您需要整场比赛,但通常您只需要其中的一部分。例如,这个正则表达式匹配"Page X of Y"字符串:

Page \d+ of \d+

如果你传递一个字符串

Page 14 of 203

您将匹配整个字符串。现在假设您只想要14203。没问题 - 正则表达式库允许您将两者括\d+在括号中,然后仅从匹配中检索"14""203"字符串。

Page (\d+) of (\d+)

上面的表达式创建了两个捕获组。通过匹配模式获得的Matcher对象允许您单独检索这些组的内容:

Pattern p = Pattern.compile("Page (\\d+) of (\\d+)");
String text = "Page 14 of 203";
Matcher m = p.matcher(text);
if (m.find()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
}

这打印14203.

ideone 上的演示

于 2013-04-16T13:24:43.130 回答
2

捕获组允许查询匹配器以找出与正则表达式的特定部分匹配的字符串部分,请参见以下示例:

String dateStr = "1981-06-25";

Pattern datePatt = Pattern.compile("([0-9]{4})/([0-9]{2})/([0-9]{2})");
...
Matcher m = datePatt.matcher(dateStr);
if (m.matches()) {
    int year  = Integer.parseInt(m.group(1));
    int month = Integer.parseInt(m.group(2));
    int day   = Integer.parseInt(m.group(3));
}

变量年、月和日分别包含组 1、2 和 3 的值。

于 2013-04-16T13:32:12.500 回答
1

正是因为您想要跟踪比赛的某些部分。例如,如果您有正则表达式

/^(http|ftp).*/

你得到一个匹配,你可以查询该组的匹配,并判断它是 http 还是 ftp。

于 2013-04-16T13:22:51.577 回答
0

例如采用正则表达式

cat (dog )?bus

这将匹配字符串cat dog buscat bus. 那是因为整个dog部分都是可选的,因为?. 如果你没有用括号括起来,那么只有最后一个空格是可选的。

James while John (had )+a better effect on the teacher

将匹配字符串

James while John had had had had had had had had had had had a better effect on the teacher

因为它将匹配整个had字符串中的一个或多个。

您还可以对捕获组使用交替和反向引用(您还没有完全了解)。

(cat|dog) is a \1

\1是对在第一个捕获组中捕获的任何内容的引用。这将匹配dog is a dogand cat is a cat,但不匹配,dog is a cat反之亦然。

于 2013-04-16T13:26:16.083 回答
0

在这里您可以看到一些您可以轻松理解的代码示例。

基本上你()在比赛后所记得的。您可以看到与该组匹配的字符串。请记住,如果您进行第二次匹配,这些值将被第二次匹配替换,因此如果您需要它们,您需要在匹配后立即将它们保存在您定义的某个变量中。

于 2013-04-16T13:26:33.910 回答