4.2 子模式
多数情况下,提到正则表达式中的子模式(subpattern),就是指分组中的一个或多个分组。子模式就是模式中的模式。多数情况下,子模式中的条件能得到匹配的前提是前面的模式得到匹配,但也有例外。子模式的写法可以有很多种,这里我们主要关注括号中的子模式。
从某种意义上说,你之前所见的模式:
(the|The|THE)
有三个子模式:the是第一个子模式,The是第二个,而THE是第三个。但是这种情况下,匹配第二个子模式不依赖于是否匹配第一个。(最左边的模式会首先匹配。)
而在以下的模式中,子模式依赖于前面的模式:
(t|T)h(e|eir)
通俗地讲,这个模式会匹配字面值t或T,然后是一个h,接下来就是一个e或者是eir。相应地,这个模式会匹配以下所有情况:
- the;
- The;
- their;
- Their。
在以上情况中,第二个子模式(e|eir)
依赖于第一个子模式(tT)
。
括号对于子模式不是必需的。下面是一个使用字符组的子模式示例:
\b[tT]h[ceinry]*\b
这个模式会匹配the或The还有thee、thy以及thence等单词。两个单词边界(\b
)表示该模式只匹配整个单词,而不会匹配单词中的某几个字母。
以下是对这个模式的解析。
\b
匹配单词起始边界。[tT]
是字符组,它匹配小写字母t或者大写字母T。可以将其看做是第一个子模式。- 然后匹配(或尝试匹配)小写字母h。
- 第二个也就是最后一个子模式也表示为字符组
[ceinry]
,其后用量词*
表示零个或多个。- 最后,该模式以另外一个
\b
结束。
- 最后,该模式以另外一个
正则表达式的术语经常是含义相近但使用范围迥异。为了在本书中解释子模式和其他概念,我查阅了很多资料并试着将它们的表述统一起来。但肯定会有人争辩说字符组不是子模式。我的观点是它们与子模式起到的作用一样,所以两者可以归为一类。