快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
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
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS 源和博客
RegexBuddy—The best regex editor and tester for GNU users!

GNU 正则表达式扩展

GNU 是“GNU’s Not Unix”的缩写,是一个致力于为世界提供所有在 Unix 系统上常见的工具的免费和开放实现的项目。大多数 Linux 系统都附带了全套 GNU 应用程序。这显然包括传统的正则表达式实用程序,如 grep、sed 和 awk。

GNU 对这些工具的实现遵循 POSIX 标准,并添加了 GNU 扩展。GNU 扩展的效果是 基本正则表达式 风格和 扩展正则表达式 风格都提供了完全相同的功能。唯一的区别是,BRE 将使用反斜杠赋予各种字符特殊含义,而 ERE 将使用反斜杠消除相同字符的特殊含义。

GNU 基本正则表达式 (grep、ed、sed)

基本正则表达式或 BRE 风格可能是当今仍在使用的最古老的正则表达式风格。GNU 实用程序 grep、ed 和 sed 使用它。区别这种风格的一件事是,大多数元字符需要一个反斜杠来赋予元字符其风格。包括 GNU ERE 在内的其他大多数风格使用反斜杠来抑制元字符的含义。使用反斜杠来转义永远不是元字符的字符是一个错误。

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

其他 BRE 元字符需要一个反斜杠来赋予它们特殊含义。原因是最早版本的 UNIX grep 不支持这些字符。grep 的开发者希望保持它与现有正则表达式的兼容性,这些表达式可能将这些字符用作字面字符。BRE a{1,2} 从字面上匹配 a{1,2},而 a\{1,2\} 匹配 aaa。令牌可以用 \(\) 分组。反向引用通常为 \1\9。最多允许 9 个组。例如,\(ab\)\1 匹配 abab,而 (ab)\1 无效,因为没有与反向引用 \1 对应的捕获组。使用 \\1 从字面上匹配 \1

在 POSIX BRE 提供的内容之上,如上所述,GNU 扩展提供了 \?\+ 作为 \{0,1\}\{1,\} 的替代语法。它通过 \| 添加了交替,这是 POSIX BRE 中非常缺少的东西。事实上,这些扩展意味着 GNU BRE 具有与 GNU ERE 完全相同的功能,除了 +?|、大括号和小括号需要反斜杠赋予它们特殊含义,而不是取消含义。

GNU 扩展正则表达式 (egrep、awk、emacs)

GNU 实用程序 egrep 和 awk 以及 emacs 编辑器使用扩展正则表达式或 ERE 风格。在此上下文中,“扩展”纯粹是历史参考。GNU 扩展使 BRE 和 ERE 风格在功能上相同。

所有元字符都有其含义,无需反斜杠,就像在现代正则表达式风格中一样。你可以使用反斜杠来抑制所有元字符的含义。转义不是元字符的字符是一个错误。

量词 ?+{n}{n,m}{n,} 分别重复前一个令牌 0 次或 1 次、1 次或多次、n 次、n 到 m 次和 n 次或更多次。交替 通过通常的竖线 | 来支持。未装饰的小括号创建一个组,例如 (abc){2} 匹配 abcabc

POSIX ERE 不支持 反向引用。GNU 扩展添加了它们,使用相同的 \1\9 语法。

其他 GNU 扩展

GNU 扩展不仅让这两种风格相同。它们还添加了一些新语法和一些全新功能。速记类 \w\W\s\S 可以用来代替 [[:alnum:]_][^[:alnum:]_][[:space:]][^[:space:]]。你可以在正则表达式中直接使用它们,但不能在方括号表达式中使用。方括号表达式中的反斜杠始终是文本。

新功能是 单词边界锚点。与现代风格一样,GNU 支持 \b 在单词边界处匹配,\B 在非单词边界处匹配。\< 在单词开头处匹配,\> 在单词结尾处匹配。锚点 \`(反引号)在主题字符串的开头处匹配,而 \'(单引号)在结尾处匹配。这些在可以同时对多行文本匹配正则表达式的工具中很有用,因为那时 ^ 将在行首匹配,$ 在行尾匹配。

Gnulib

如果你不能在自己的(开源)应用程序中使用他们的正则表达式实现,GNU 就不是 GNU。要做到这一点,你需要 下载 Gnulib。使用附带的 gnulib-tool 将正则表达式模块复制到应用程序的源代码树中。

正则表达式模块提供了标准 POSIX 函数 regcomp() 用于编译正则表达式,regerror() 用于处理编译错误,regexec() 用于使用已编译的正则表达式运行搜索,regfree() 用于清理你完成的正则表达式。

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

| 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 |