语法
章节大纲
-
正则表达式的不同变体
正则表达式有多个变体,它们不仅在具体的语法上有所不同,在功能上也各具特色。支持正则表达式的工具和编程语言通常也会有自己独特的实现方式。
常见的正则表达式变体
-
简单正则表达式(Simple Regular Expressions)
- 主要用于向后兼容,但在符合 POSIX 标准的系统上已被弃用。
-
基本正则表达式(Basic Regular Expressions,BRE)
- 由一些 Unix Shell 工具(如
grep
和sed
)使用。
- 由一些 Unix Shell 工具(如
-
Perl 兼容正则表达式(Perl-Compatible Regular Expressions,PCRE)
- 由 Perl 及一些应用程序使用,功能非常强大。
-
POSIX 基本正则表达式(POSIX Basic Regular Expressions,POSIX BRE)
- 旨在增强不同工具间的一致性,但某些传统的 Unix 工具不支持这些扩展。
-
POSIX 扩展正则表达式(POSIX-Extended Regular Expressions,POSIX ERE)
- 通过
-E
选项在某些 Unix 工具(如grep -E
、sed -E
)中启用。
- 通过
-
非 POSIX 基本正则表达式(Non-POSIX Basic Regular Expressions)
- 提供 POSIX 不支持的额外字符类,例如
\w
(匹配字母和数字)。
- 提供 POSIX 不支持的额外字符类,例如
-
Emacs 正则表达式(Emacs Regular Expressions)
- 主要用于 Emacs 编辑器 的文本搜索和替换。
-
Shell 正则表达式(Shell Regular Expressions)
- 用于 模式匹配(Pattern Matching)和文件名替换(Filename Substitution),功能较有限。
贪婪匹配(Greedy Expressions)
在正则表达式中,
*
和+
等量词(Quantifiers)默认是贪婪的(Greedy),它们会尽可能多地匹配字符。这种特性在某些情况下可能会导致不符合预期的匹配结果。示例:
假设我们希望匹配第一个用双引号
"
括起来的字符串,例如:These words include "cat", "mat", and "pat".
使用正则表达式
"*"
会匹配:These words include "cat", "mat", and "pat".
错误匹配部分(斜体部分):
These words include *"cat", "mat", and "pat".*
它匹配了整个
"cat", "mat", and "pat"
,而我们只想匹配第一个 "cat"。修正方案
- 使用非贪婪匹配(Non-Greedy Matching)
- 一些正则表达式变体支持非贪婪运算符:
*?
+?
}?
- 例如,在 PHP 中,可以使用
U
修饰符使量词变为非贪婪匹配:/".*"/U
- 一些正则表达式变体支持非贪婪运算符:
- 使用排除匹配法
- 在不支持
*?
的环境中,我们可以使用排除字符来控制匹配范围:"[^"]*"
- 这个表达式确保
"
内部的内容不能包含双引号,从而正确匹配:"cat"
- 在不支持
正则表达式特性对比
不同工具和编程语言对正则表达式的支持不同。想要了解哪些功能或变体适用于特定工具或语言,可以参考 regular-expressions.info 提供的对比表格(Comparison Table)。
-