Swift 的 RegEx 语法规范在哪里?比如支持哪些字符类,支持哪些匹配结构等等?
在官方文档中,我只看到以编程方式支持的内容,但通常您不会编写 RegEx 代码,通常您用 RegEx 语法编写它们(
/.../
),并且这里几乎地球上的每种编程语言都有自己的该语法变体(通常是 PCRE 的子集),因此应该有一个文档来描述支持哪些语法元素(以及隐式不支持哪些元素)。
背景
官方标准化的正则表达式语法只有三种类型:
至于第一个,忘记我什至提到过它,它已经被弃用很久了。这三种语法由 IEEE 于 1992 年标准化,作为 POSIX 标准的一部分(随着 POSIX.2 的发布)。这意味着有一个官方文档准确描述了哪些代币确实存在以及匹配过程如何与这些代币相关。
1987 年 Perl 发布时,并不存在最终的 RegEx 标准,因此 Perl 创建了自己的标准,今天称为“Perl 兼容正则表达式”(PCRE)。 今天,C API (
regex.h
) 仍然只支持 BRE 和 ERE(BRE 是默认值)。大多数现代编程语言更喜欢 PCRE,但它们都不支持 Perl 支持的完整功能集,它们都只支持 PCRE 的一个子集,并且这个子集因语言而异。
例如要匹配 ERE 中的数字,您将使用[[:digit:]]
并匹配任何非数字您将使用
[^[:digit:]]
,要匹配 PCRE 中的数字您将使用 \d
并匹配非数字您会使用 \D
(但 Perl 也支持 ERE 语法)。但并非所有语言都支持所有 PRCE 类。Swift 确实支持 \d
和
\w
但它也支持 \N
吗? PHP 确实如此。 Python、Go、Java、.NET 和 Rust 没有。您不必通过反复试验来猜测和找出答案,每种语言都应该有其支持的正则表达式语法的文档。仅举几例:
Perl:
https://perldoc.perl.org/perlre
PHP:https://www.php.net/manual/en/reference.pcre.pattern.syntax.php
Python:https://docs.python.org/3/howto/regex.html
我怎么知道 Swift 知道
\d
和
\D
、\w
和 \W
但不知道 \N
?向前看和向后看怎么样?不同类型的捕获组怎么样?我在 NSRegularExpression
的文档中找到了语法描述,您也可以在 Swift 中使用它,也可以在 macOS 上使用,但这要归功于 Foundation 框架。这不是 Swift 语言内置的本机 RegEx 引擎。
这是NSRegularExpression
的文档:
https://developer.apple.com/documentation/foundation/nsregularexpressionNSRegularExpression
基于
ICU的正则表达式引擎,它只是另一个PRCE子集,但针对Unicode处理进行了优化(Perl RegEx具有Unicode支持,但可能无法始终正确或按预期处理所有Unicode数据)。然而 Swift 明确表示它并不基于 ICU 引擎,因为该引擎处理字符串数据类型的方式与 Swift 中字符串的实现方式根本不兼容,因此来回转换字符串会产生巨大的开销。
正则表达式语法和运行时构造我们建议接受以下现有正则表达式引擎的语法“超集”:
PCRE 2,“行业标准”和 Perl、Python 等的粗略超集
- Oniguruma,具有附加功能的现代引擎。
- ICU,由专注于 Unicode 的引擎 NSRegularExpression 使用。
- .NET,它添加了分隔符平衡和一些有关条件模式的有趣的小细节。
- 据我们所知,所有其他流行的正则表达式引擎都支持上述语法的子集。
来源:
因此,正如预期的那样,Swift 有自己的语法组合,与任何其他编程语言都不兼容,并借用了各种语言和现有 RegEx 实现的功能。
该网站还详细介绍了当前支持哪些正则表达式构造。您可以预期大多数标准 PCRE 表达式都可以工作,但要小心更奇特的东西(例如,不支持后视,正如
Rob