快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
grep
PowerGREP
RegexBuddy
RegexMagic
通用应用程序
EditPad Lite
EditPad Pro
语言和库
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
数据库
MySQL
Oracle
PostgreSQL
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS Feed 和博客
RegexBuddy—The best regex editor and tester for POSIX developers!

POSIX 基本正则表达式

POSIX 或“uniX 便携式操作系统接口”是一系列标准,它们定义了(UNIX)操作系统应支持的部分功能。其中一个标准定义了两种正则表达式风格。涉及正则表达式的命令,如 grep 和 egrep,在 POSIX 兼容的 UNIX 系统上实现了这些风格。一些 数据库系统 也使用 POSIX 正则表达式。

基本正则表达式或 BRE 风格标准化了一种类似于传统 UNIX grep 命令使用的风格。这几乎是最古老的正则表达式风格,至今仍在使用。使这种风格与众不同的一点是,大多数元字符需要反斜杠才能赋予元字符其风格。包括 POSIX ERE 在内的其他大多数风格使用反斜杠来抑制元字符的含义。使用反斜杠来转义永远不是元字符的字符是一个错误。

BRE 支持 POSIX 方括号表达式,它类似于其他正则表达式风格中的字符类,具有一些特殊功能。不支持简写。使用通常的元字符的其他功能有 匹配除换行符之外的任何字符,插入符号和美元 匹配字符串的开头和结尾,以及 星号 重复标记零次或多次。要逐字匹配这些字符中的任何一个,请使用反斜杠对其进行转义。

其他 BRE 元字符需要使用反斜杠才能赋予其特殊含义。原因是 UNIX grep 的最旧版本不支持这些元字符。grep 的开发者希望使其与现有的正则表达式保持兼容,这些表达式可能将这些字符用作文本字符。BRE a{1,2} 按字面意思匹配 a{1,2},而 a\{1,2\} 匹配 aaa。一些实现支持 \?\+ 作为 \{0,1\}\{1,\} 的替代语法,但 \?\+ 不是 POSIX 标准的一部分。可以使用 \(\) 对标记进行分组。反向引用通常为 \1\9。仅允许最多 9 个组。例如,\(ab\)\1 匹配 abab,而 (ab)\1 无效,因为没有与反向引用 \1 对应的捕获组。使用 \\1 按字面意思匹配 \1

POSIX BRE 不支持任何其他功能。甚至 交替 也不支持。

POSIX 扩展正则表达式

扩展正则表达式或 ERE 风格标准化了一种类似于 UNIX egrep 命令使用的风格。“扩展”相对于原始 UNIX grep,它仅具有方括号表达式、点、插入符号、美元符号和星号。ERE 支持这些内容,就像 BRE 一样。大多数现代 regex 风格都是 ERE 风格的扩展。按照今天的标准,POSIX ERE 风格相当简单。POSIX 标准定义于 1986 年,自那时以来,正则表达式已经取得了长足的发展。

egrep 的开发者没有尝试与 grep 保持兼容,而是创建了一个单独的工具。因此,egrep 和 POSIX ERE 添加了其他元字符,而无需反斜杠。你可以使用反斜杠来抑制所有元字符的含义,就像在现代 regex 风格中一样。转义一个不是元字符的字符是一个错误。

量词 ?+{n}{n,m}{n,} 分别重复前一个标记零次或一次、一次或多次、n 次、n 到 m 次以及 n 次或更多次。交替通过通常的竖线 | 支持。未加修饰的括号创建一个组,例如 (abc){2} 匹配 abcabc。POSIX 标准未定义反向引用。一些实现确实支持 \1\9,但这些不是 ERE 标准的一部分。ERE 是旧 UNIX grep 的扩展,而不是 POSIX BRE 的扩展。

而这正是扩展的全部内容。

POSIX ERE 交替返回最长匹配

在关于交替的教程主题中,我解释了正则表达式引擎在找到匹配的备选方案后将停止。然而,POSIX 标准要求返回最长匹配。当将 Set|SetValue 应用于 SetValue 时,符合 POSIX 的正则表达式引擎将完全匹配 SetValue。即使引擎是正则表达式定向 NFA 引擎,POSIX 也要求它通过尝试所有备选方案并返回最长匹配(在本例中为 SetValue)来模拟DFA 文本定向匹配。传统的 NFA 引擎将匹配 Set,就像本网站上讨论的所有其他正则表达式风格一样。

符合 POSIX 的引擎仍将找到最左匹配。如果您将 Set|SetValue 应用于 Set or SetValue 一次,它将匹配 Set。字符串中的第一个位置是我们正则表达式可以找到有效匹配的最左位置。在字符串中可以找到更长的匹配这一事实无关紧要。如果您第二次应用正则表达式,从字符串中的第一个空格继续,那么将匹配 SetValue。传统的 NFA 引擎将匹配字符串开头的 Set 作为第一个匹配,并将匹配字符串中第 3 个单词开头的 Set 作为第二个匹配。

| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML 模式 | Xojo | XQuery 和 XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |