正则表达式引擎/风味对比

更新时间:2019-11-27 允许转载 转载请注明来源

说明:本文内容翻译后整理自regular-expressions.mobi。原网址只有使用手机浏览器才能正常访问。

正则表达式引擎/风味说明

风味是规范,引擎是实现。

名称 说明 应用
.NET System.Text.RegularExpressions 相关类 提供的正则引擎。 基于 .Net 的语言和软件。如 C#, Visual Basic.Net, F#, Powershell, Delphi for .NET 等。
Java java.util.regex 包提供, 在 Java 4 (JDK 1.4.x) 及更新的版本中可用。在 Java 5 (JDK 1.5.x) 和 6 (JDK 1.6.x) 中添加了一些新功能。 基于 JVM 的语言和软件,如 Java, Clojure 等。
Perl 内置于 Perl 的正则表达式引擎,5.6 之前的版本不支持 Unicode。 Perl 编程语言。
PCRE 来自开源项目 PCRE正则表达式引擎。 本文介绍的功能在 PCRE 5.x 和 6.x 中可用。 REALbasic(Xojo) 语言; Delphi 组件 TPerlRegEx 和 Delphi XE 和 C++Builder XE 的单元 RegularExrpessionsRegularExpressionsCore; PHP 的 preg 函数; R 语言(perl = true); COM 对象 Microsoft VBScript Regular Expressions 5.5。
JS(JavaScript) ECMA-262 标准第 3 版定义的脚本语言(ECMAScript)中的正则表达式语法。 JavaScript 编程语言;VBScript 中的 RegExp;ClojureScript 编程语言。
Python 由 Python 内置模块 re 支持。 Python 编程语言。
Ruby 由 Ruby 内置的正则表达式引擎 Ruby 编程语言。
Tcl ARE 由 Henry Spencer 为 Tcl 8.2/8.4 中命令 regexp 开发,被称为高级正则表达式(Advanced Regular Expressions, ARE) Tcl 编程语言;PostgreSQL 7.4 及更新版本;wxWidgets(wxRE_ADVANCED)。
POSIX BRE IEEE POSIX 标准 1003 定义的基本正则表达式(Basic Regular Expressions) Unix 上的软件工具;R 语言(perl = false, extended = false);Tcl的 基本风味(Extended Regular Expressions),wxWidgets(wxRE_BASIC)。
POSIX ERE IEEE POSIX 标准 1003 定义的扩展正则表达式(Extended Regular Expressions) Unix 上的软件工具,如 awk, grep, egrep, emacs 等(Emacs 不支持 POSIX 字符类, 排序序列和等值字符); MySQL, Oracle 数据库( Oracle 支持标准外的后向引用,从 \1\9),PostgreSQL 7.3 及更早版本; PHP 的 ereg 函数,R 语言默认状态,Tcl 的扩展风味(Extended Regular Expressions),wxWidgets(wxRE_EXTENDED)。
GNU BRE GNU 基本正则表达式(GNU Basic Regular Expressions), 包含 POSIX BRE 及 GNU 扩展。 GNU 实现的经典 UNIX 工具,如 GNU/Linux 上的 sed 等。
GNU ERE GNU 扩展正则表达式(Extended Regular Expressions), 包含 POSIX ERE 及 GNU 扩展。 GNU 实现的经典 UNIX 工具,如 GNU/Linux 上的 egrep, grep 等。
XML XML Schema 标准的附录 G定义。 XML Schema。
XPath 由 XQuery 1.0 和 XPath 2.0 标准中的函数与运算符章节定义。 XQuery, XPath。
JGsoft Just Great Software 产品使用的正则表达式引擎 PowerGREP, EditPad Pro, AceText, RegexBuddy 等。

正则表达式引擎/风味特性对比表

字符
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
\ 转义单个元字符 YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES
\Q...\E 转义多个元字符 YES no Java 6 YES YES no no no no no no no no no no
\x00 ~ \xFF (ASCII 字符) YES YES YES YES YES YES YES YES YES no no no no no no
\n (换行), \r (回车), \t (制表) YES YES YES YES YES YES YES YES YES no no no no YES YES
\f (换页), \v (竖直制表) YES YES YES YES YES YES YES YES YES no no no no no no
\a (响铃) YES YES YES YES YES no YES YES YES no no no no no no
\e (转义) YES YES YES YES YES no no YES YES no no no no no no
\b (退格), \B (反斜杠, \) no no no no no no no no YES no no no no no no
\cA ~ \cZ (控制字符) YES YES YES YES YES YES no no YES no no no no no no
\ca ~ \cz (控制字符) YES YES no YES YES YES no no YES no no no no no no
字符类/字符集 [abc]
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
[abc] 字符类 YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES
[^abc] 反义字符类 YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES
[a-z] 字符类范围 YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES
[\d-z] 中的 - 视为字面量 YES YES YES YES YES no no no no no no no no no no
[a-\d] 中的 - 视为字面量 YES no no no YES no no no no no no no no no no
\ 转义单个字符类元字符 YES YES YES YES YES YES YES YES YES no no no no YES YES
\Q...\E 转义多个字符类元字符 YES no Java 6 YES YES no no no no no no no no no no
\d 代表数字 YES YES ascii YES ascii ascii option ascii YES no no no no YES YES
\w 代表单词字符 YES YES ascii YES ascii ascii option ascii YES no no YES YES YES YES
\s 代表空白字符 YES YES ascii YES ascii YES option ascii YES no no YES YES ascii ascii
\D, \W and \S 代表反义字符类 YES YES YES YES YES YES YES YES YES no no YES YES YES YES
[\b] 匹配反斜杠(\) YES YES YES YES YES YES YES YES YES no no no no no no
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
. 匹配换行符(\n)外所有字符 YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES
锚点
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
^ 字符串/行开始 YES YES YES YES YES YES YES YES YES YES YES YES YES no YES
$ 字符串/行结束 YES YES YES YES YES YES YES YES YES YES YES YES YES no YES
\A 字符串开始 YES YES YES YES YES no YES YES YES no no no no no no
\Z 字符串结束,最后一个\n前 YES YES YES YES YES no no YES YES no no no no no no
\z 字符串结束 YES YES YES YES YES no \Z YES no no no no no no no
\` 字符串开始 no no no no no no no no no no no YES YES no no
\' 字符串结束 no no no no no no no no no no no YES YES no no
单词边界
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
\b 单词的开始或结束处 YES YES YES YES ascii ascii option ascii no no no YES YES no no
\B 不是单词的开始处或结束处 YES YES YES YES ascii ascii option ascii no no no YES YES no no
\y 单词的开始或结束处 YES no no no no no no no YES no no no no no no
\Y 不是单词的开始处或结束处 YES no no no no no no no YES no no no no no no
\m 单词的开始处 YES no no no no no no no YES no no no no no no
\M 单词的结束处 YES no no no no no no no YES no no no no no no
\< 单词的开始处 no no no no no no no no no no no YES YES no no
\> 单词的结束处 no no no no no no no no no no no YES YES no no
分支条件
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
| 分支条件 YES YES YES YES YES YES YES YES YES no YES \| YES YES YES
量词
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
? 0 ~ 1 次 YES YES YES YES YES YES YES YES YES no YES \? YES YES YES
* 0 次或更多次 YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES
+ 1 次或更多次 YES YES YES YES YES YES YES YES YES no YES \+ YES YES YES
{n} n 次 YES YES YES YES YES YES YES YES YES \{n\} YES \{n\} YES YES YES
{n,m} n ~ m 次 YES YES YES YES YES YES YES YES YES \{n,m\} YES \{n,m\} YES YES YES
{n,} n 次或更多次 YES YES YES YES YES YES YES YES YES \{n,\} YES \{n,\} YES YES YES
量词后加 ? 转为懒惰模式 YES YES YES YES YES YES YES YES YES no no no no no YES
分组与后向引用
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
(regex) 编号捕获组 YES YES YES YES YES YES YES YES YES \( \) YES \( \) YES YES YES
(?:regex) 非捕获组 YES YES YES YES YES YES YES YES YES no no no no no no
\1 ~ \9 后向引用 YES YES YES YES YES YES YES YES YES YES no YES YES no YES
\10 ~ \99 后向引用 YES YES YES YES YES YES YES YES YES no n/a no no n/a YES
前向引用 \1 through \9 YES YES YES YES YES no no YES no no n/a no no n/a no
嵌套引用 \1 ~ \9 YES YES YES YES YES YES no YES no no n/a no no n/a no
后向引用不存在的组报错 YES YES YES YES YES no YES no YES YES n/a YES YES n/a YES
后向引用匹配失败的组失败 YES YES YES YES YES no YES YES YES YES n/a YES YES n/a YES
修饰器
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
(?i) 忽略大小写 YES YES YES YES YES /i only YES YES YES no no no no no flag
(?s) 点(.)可匹配\n YES YES YES YES YES no YES (?m) no no no no no no flag
(?m) 行开始/结束可匹配 ^ / $ YES YES YES YES YES /m only YES always on no no no no no no flag
(?x) 忽略空白模式 YES YES YES YES YES no YES YES YES no no no no no flag
(?n) 显式匹配 YES YES no no no no no no no no no no no no no
(?-ismxn) 关闭模式修饰器 YES YES YES YES YES no no YES no no no no no no no
(?ismxn:group) 模式修饰器仅应用于本组 YES YES YES YES YES no no YES no no no no no no no
原子组与占位量词(possessive quantifiers)
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
(?>regex) 原子组 YES YES YES YES YES no no YES no no no no no no no
?+, *+, ++, {m,n}+ 占位量词 YES no YES no YES no no no no no no no no no no
断言
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
(?=regex) 正预测先行断言 YES YES YES YES YES YES YES YES YES no no no no no no
(?!regex) 负预测先行断言 YES YES YES YES YES YES YES YES YES no no no no no no
(?<=text) 正回顾后发断言 full regex full regex finite length fixed length fixed + alternation no fixed length no no no no no no no no
(?<!text) 负回顾后发断言 full regex full regex finite length fixed length fixed + alternation no fixed length no no no no no no no no
从上个匹配继续
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
\G 匹配尝试的开始 YES YES YES YES YES no no YES no no no no no no no
条件
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
(?(?=regex)then|else) 使用任意断言 YES YES no YES YES no no no no no no no no no no
(?(regex)then|else) no YES no no no no no no no no no no no no no
(?(1)then|else) YES YES no YES YES no YES no no no no no no no no
(?(group)then|else) YES YES no no YES no YES no no no no no no no no
注释
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
(?#comment) YES YES no YES YES no YES YES YES no no no no no no
忽略空白
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
支持忽略空白语法 YES YES YES YES YES no YES YES YES no no no no no YES
字符类作为整体 YES YES no YES YES n/a YES YES YES n/a n/a n/a n/a n/a YES
# 开启注释 YES YES YES YES YES n/a YES YES YES n/a n/a n/a n/a n/a no
Unicode 字符
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
\X Unicode 字素 YES no no YES option no no no no no no no no no no
\u0000 ~ \uFFFF (Unicode 字符) YES YES YES no no YES u"string" no YES no no no no no no
\x{0} ~ \x{FFFF} (Unicode 字符) YES no no YES option no no no no no no no no no no
Unicode 属性, 脚本与区块
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
\pL ~ \pC (Unicode 属性) YES no YES YES option no no no no no no no no no no
\p{L} ~ \p{C} (Unicode 属性) YES YES YES YES option no no no no no no no no YES YES
\p{Lu} ~ \p{Cn} (Unicode 属性) YES YES YES YES option no no no no no no no no YES YES
\p{L&}, \p{Letter&} 等同于 [\p{Lu}\p{Ll}\p{Lt}] Unicode 属性 YES no no YES option no no no no no no no no no no
\p{IsL} ~ \p{IsC} (Unicode 属性) YES no YES YES no no no no no no no no no no no
\p{IsLu} ~ \p{IsCn} (Unicode 属性) YES no YES YES no no no no no no no no no no no
\p{Letter} ~ \p{Other} (Unicode 属性) YES no no YES no no no no no no no no no no no
\p{Lowercase_Letter} ~ \p{Not_Assigned} (Unicode 属性) YES no no YES no no no no no no no no no no no
\p{IsLetter} ~ \p{IsOther} (Unicode 属性) YES no no YES no no no no no no no no no no no
\p{IsLowercase_Letter} ~ \p{IsNot_Assigned} (Unicode 属性) YES no no YES no no no no no no no no no no no
\p{Arabic} ~ \p{Yi} (Unicode 脚本) YES no no YES option no no no no no no no no no no
\p{IsArabic} ~ \p{IsYi} (Unicode 脚本) YES no no YES no no no no no no no no no no no
\p{BasicLatin} ~ \p{Specials} (Unicode 区块) YES no no YES no no no no no no no no no no no
\p{InBasicLatin} ~ \p{InSpecials} (Unicode 区块) YES no YES YES no no no no no no no no no no no
\p{IsBasicLatin} ~ \p{IsSpecials} (Unicode 区块) YES YES no YES no no no no no no no no no YES YES
上方 {} 中的内容忽略大小写 YES no no YES no no no no no no no no no no no
上方语法中长名称允许空格,边字符,下划线 (如 BasicLatin 可写为 Basic-LatinBasic_LatinBasic Latin) YES no Java 5 YES no no no no no no no no no no no
\P 上方所有 \p 的反义 YES YES YES YES option no no no no no no no no YES YES
\p{^...} 上方所有 \p{...} 的反义 YES no no YES option no no no no no no no no no no
命名捕获与后向引用
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
(?<name>regex) .Net 风格的命名捕获分组 YES YES no no no no no no no no no no no no no
(?'name'regex) .Net 风格的命名捕获分组 YES YES no no no no no no no no no no no no no
\k<name> .Net 风格的命名后向引用 YES YES no no no no no no no no no no no no no
\k'name' .Net 风格的命名后向引用 YES YES no no no no no no no no no no no no no
(?P<name>regex) Python 风格的命名捕获分组 YES no no no YES no YES no no no no no no no no
(?P=name) Python 风格的命名后向引用 YES no no no YES no YES no no no no no no no no
多个捕获组同名 YES YES n/a n/a no n/a no n/a n/a n/a n/a n/a n/a n/a n/a
XML 字符类
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
\i, \I, \c, \C XML 名称字符类 no no no no no no no no no no no no no YES YES
[abc-[abc]] 字符类差集 YES 2.0 no no no no no no no no no no no YES YES
POSIX 方括号表达式
特性 JGsoft .NET Java Perl PCRE JS Python Ruby Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE XML XPath
[:alpha:] POSIX 字符类 YES no no YES ascii no no YES YES YES YES YES YES no no
\p{Alpha} POSIX 字符类 YES no ascii no no no no no no no no no no no no
\p{IsAlpha} POSIX 字符类 YES no no YES no no no no no no no no no no no
[.span-ll.] POSIX 排序序列 no no no no no no no no YES YES YES YES YES no no
[=x=] POSIX 等值字符 no no no no no no no no YES YES YES YES YES no no