快速入门
教程
工具和语言
示例
参考
书评
正则表达式教程
简介
目录
特殊字符
不可打印字符
正则表达式引擎内部
字符类
字符类减法
字符类交集
简写字符类
单词边界
交替
可选项目
重复
分组和捕获
反向引用
反向引用,第 2 部分
命名组
相对反向引用
分支重置组
自由间距和注释
Unicode
模式修饰符
原子分组
独占量词
前瞻和后顾
环视,第 2 部分
将文本排除在匹配之外
条件
平衡组
递归
子例程
无限递归
递归和量词
递归和捕获
递归和反向引用
递归和回溯
POSIX 方括号表达式
零长度匹配
继续匹配
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS 源和博客
RegexBuddy—Better than a regular expression tutorial!

可选项目

问号使正则表达式中的前一个标记可选。 colou?r 匹配 colourcolor。问号称为量词。

你可以通过使用括号将多个标记分组在一起,并将问号放在闭合括号之后,使它们可选。例如:Nov(ember)? 匹配 NovNovember

您可以通过包含多个问号来编写一个匹配许多备选方案的正则表达式。 Feb(ruary)? 23(rd)? 匹配 February 23rdFebruary 23Feb 23rdFeb 23

您还可以使用大括号使某些内容变为可选。 colou{0,1}rcolou?r 相同。 POSIX BREGNU BRE 都不支持这两种语法。这些风格需要反斜杠来赋予大括号它们的特殊含义:colou\{0,1\}r

重要的正则表达式概念:贪婪

问号是本教程介绍的第一个贪婪元字符。问号为正则表达式引擎提供了两个选择:尝试匹配问号所应用的部分,或不尝试匹配它。引擎总是尝试匹配该部分。只有当这导致整个正则表达式失败时,引擎才会尝试忽略问号所应用的部分。

效果是,如果您将正则表达式 Feb 23(rd)? 应用于字符串 Today is Feb 23rd, 2003,则匹配项始终为 Feb 23rd,而不是 Feb 23。您可以在第一个问号后加上第二个问号,从而使问号变为懒惰(即关闭贪婪)。

有关其他 重复 运算符的讨论提供了有关贪婪和懒惰量词的更多详细信息。

查看正则表达式引擎内部

让我们将正则表达式 colou?r 应用于字符串 The colonel likes the color green

正则表达式中的第一个标记是 文本 c。它成功匹配到的第一个位置是 colonel 中的 c。引擎继续,发现 o 匹配 ol 匹配 l,另一个 o 匹配 o。然后,引擎检查 u 是否匹配 n。这失败了。但是,问号告诉正则表达式引擎,不匹配 u 是可以接受的。因此,引擎跳到下一个正则表达式标记:r。但这也不匹配 n。现在,引擎只能得出结论,整个正则表达式无法从 colonel 中的 c 开始匹配。因此,引擎重新开始尝试将 c 匹配到 colonel 中的第一个 o。

经过一系列失败后,c 匹配 color 中的 colo 匹配后面的字符。现在,引擎检查 u 是否匹配 r。这失败了。再说一遍:没问题。问号允许引擎继续使用 r。这匹配 r,引擎报告正则表达式成功匹配了我们字符串中的 color