捕获群组

原文: https://docs.oracle.com/javase/tutorial/essential/regex/groups.html

上一节中,我们看到量词一次如何附加到一个字符,字符类或捕获组。但到目前为止,我们还没有详细讨论过捕捉群体的概念。

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

编号

Pattern API 中所述,捕获组通过从左到右计算它们的左括号来编号。例如,在表达式((A)(B(C)))中,有四个这样的组:

  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (C)

要查找表达式中存在多少个组,请在匹配器对象上调用groupCount方法。 groupCount方法返回int,显示匹配器模式中存在的捕获组数。在此示例中,groupCount将返回数字4,表明该模式包含 4 个捕获组。

还有一个特殊组,即组 0,它始终代表整个表达式。该组不包括在groupCount报告的总数中。以(?开头的组是纯的非捕获组,它们不捕获文本而不计入组总数。 (您将在模式类的方法部分中看到非捕获组的示例。)

了解组的编号非常重要,因为某些Matcher方法接受int指定特定组编号作为参数:

反向引用

与捕获组匹配的输入字符串部分保存在内存中,以便以后通过反向引用进行调用。在正则表达式中将反向引用指定为反斜杠(\),后跟一个指示要调用的组的编号的数字。例如,表达式(\d\d)定义一个匹配行中两个数字的捕获组,可以通过反向引用\1在表达式中稍后调用。

要匹配任何 2 位数字,后跟完全相同的两位数字,您可以使用(\d\d)\1作为正则表达式:

  1. Enter your regex: (\d\d)\1
  2. Enter input string to search: 1212
  3. I found the text "1212" starting at index 0 and ending at index 4.

如果更改最后两位数,则匹配将失败:

  1. Enter your regex: (\d\d)\1
  2. Enter input string to search: 1234
  3. No match found.

对于嵌套捕获组,反向引用的工作方式完全相同:指定反斜杠后跟要调用的组的编号。