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

文字字符

最基本的正则表达式由单个文字字符组成,例如 a。它匹配字符串中该字符的首次出现。如果字符串是 Jack is a boy,它匹配 J 之后的 a。这个 a 在单词中间这一事实对正则表达式引擎来说并不重要。如果对你来说很重要,你需要使用 单词边界 告诉正则表达式引擎。我们稍后会讲到这一点。

此正则表达式也可以匹配第二个 a。只有当你告诉正则表达式引擎在第一次匹配后开始在字符串中搜索时,它才会这样做。在文本编辑器中,你可以使用其“查找下一个”或“向前搜索”功能来执行此操作。在编程语言中,通常有一个单独的函数,你可以在上次匹配后调用该函数以继续在字符串中搜索。

类似地,正则表达式 cat关于猫和狗 中匹配 cat。此正则表达式由一系列三个文本字符组成。这类似于对正则表达式引擎说:查找一个 c,紧跟一个 a,紧跟一个 t

请注意,正则表达式引擎默认区分大小写。除非您告诉正则表达式引擎忽略大小写差异,否则 cat 不匹配 Cat

特殊字符

由于我们希望执行的操作不仅仅是搜索文本的文本片段,因此我们需要保留某些字符以供特殊使用。在 本教程中讨论的正则表达式风格 中,有 12 个具有特殊含义的字符:反斜杠 \、插入符号 ^、美元符号 $、句点或点 .、竖线或管道符号 |、问号 ?、星号或星形 *、加号 +、左圆括号 (、右圆括号 )、左方括号 [ 和左大括号 {,这些特殊字符通常称为“元字符”。单独使用时,它们中的大多数都是错误。

如果您想在正则表达式中将任何这些字符用作文本,则需要使用反斜杠对其进行转义。如果您想匹配 1+1=2,则正确的正则表达式是 1\+1=2。否则,加号具有特殊含义。

请注意,1+1=2(省略反斜杠)是一个有效的正则表达式。因此,您不会收到错误消息。但它不匹配 1+1=2。由于 加号字符 的特殊含义,它将在 123+111=234 中匹配 111=2

如果您忘记在不允许使用特殊字符的地方对其进行转义,例如在 +1 中,则会收到错误消息。

大多数正则表达式风格将大括号 { 视为一个文本字符,除非它是一个重复运算符的一部分,如 a{1,3}。因此,通常不需要用反斜杠对其进行转义,但如果你愿意,也可以这样做。但有几个例外。Java 要求转义文本左大括号。Booststd::regex 要求转义所有文本大括号。

]字符类 之外是一个文本字符。在字符类内部适用不同的规则。这些规则在有关字符类的主题中讨论。同样,也有例外。std::regexRuby 要求转义右方括号,即使在字符类之外也是如此。

所有其他字符都不应使用反斜杠进行转义。这是因为反斜杠也是一个特殊字符。反斜杠与文本字符结合可以使用特殊含义创建正则表达式标记。例如,\d 是一个 简写,它匹配从 09 的单个数字。

使用反斜杠转义单个元字符适用于所有正则表达式风格。一些风格还支持 \Q\E 转义序列。介于 \Q\E 之间的所有字符都被解释为文本字符。例如,\Q*\d+*\E 匹配文本字符 *\d+*\E 可以在正则表达式的末尾省略,因此 \Q*\d+*\Q*\d+*\E 相同。此语法受 JGsoft 引擎PerlPCREPHPDelphiJava 支持,无论是在 字符类 内外。然而,Java 4 和 5 存在导致 \Q\E 出现异常行为的错误,因此你不应该在 Java 中使用此语法。Boost 在字符类之外支持它,但在字符类内部不支持。

特殊字符和编程语言

如果您是一名程序员,您可能会惊讶于单引号和双引号之类的字符不是特殊字符。这是正确的。在使用 正则表达式或 grep 工具(例如 PowerGREP 或 文本编辑器(例如 EditPad Pro)的搜索功能)时,您不应该像在编程语言中那样转义或重复引号字符。

在您的源代码中,您必须记住哪些字符在字符串中会受到编程语言的特殊处理。这是因为这些字符是由编译器处理的,在正则表达式库看到字符串之前。因此,正则表达式 1\+1=2 必须在 C++ 代码中写为 "1\\+1=2"。C++ 编译器将源代码中的转义反斜杠转换为传递给正则表达式库的字符串中的单个反斜杠。若要匹配 c:\temp,您需要使用正则表达式 c:\\temp。作为 C++ 源代码中的字符串,此正则表达式变为 "c:\\\\temp"。四个反斜杠确实匹配一个反斜杠。

请参阅本网站的 工具和语言 部分,以获取有关如何在各种编程语言中使用正则表达式的更多信息。