4.2 子模式

多数情况下,提到正则表达式中的子模式(subpattern),就是指分组中的一个或多个分组。子模式就是模式中的模式。多数情况下,子模式中的条件能得到匹配的前提是前面的模式得到匹配,但也有例外。子模式的写法可以有很多种,这里我们主要关注括号中的子模式。

从某种意义上说,你之前所见的模式:

  1. (the|The|THE)

有三个子模式:the是第一个子模式,The是第二个,而THE是第三个。但是这种情况下,匹配第二个子模式不依赖于是否匹配第一个。(最左边的模式会首先匹配。)

而在以下的模式中,子模式依赖于前面的模式:

  1. (t|T)h(e|eir)

通俗地讲,这个模式会匹配字面值t或T,然后是一个h,接下来就是一个e或者是eir。相应地,这个模式会匹配以下所有情况:

  • the;
  • The;
  • their;
  • Their。

在以上情况中,第二个子模式(e|eir)依赖于第一个子模式(tT)

括号对于子模式不是必需的。下面是一个使用字符组的子模式示例:

  1. \b[tT]h[ceinry]*\b

这个模式会匹配the或The还有thee、thy以及thence等单词。两个单词边界(\b)表示该模式只匹配整个单词,而不会匹配单词中的某几个字母。

以下是对这个模式的解析。

  • \b匹配单词起始边界。
  • [tT]是字符组,它匹配小写字母t或者大写字母T。可以将其看做是第一个子模式。
  • 然后匹配(或尝试匹配)小写字母h。
  • 第二个也就是最后一个子模式也表示为字符组[ceinry],其后用量词*表示零个或多个。
    • 最后,该模式以另外一个\b结束。

正则表达式的术语经常是含义相近但使用范围迥异。为了在本书中解释子模式和其他概念,我查阅了很多资料并试着将它们的表述统一起来。但肯定会有人争辩说字符组不是子模式。我的观点是它们与子模式起到的作用一样,所以两者可以归为一类。