5. 将 I-Regexp 映射到 Regexp 方言
5. 将 I-Regexp 映射到 Regexp 方言
本节材料不具有规范性; 它作为指导提供给希望在其他正则表达式方言语境中使用 I-Regexps 的开发者.
5.1 多字符转义
I-Regexp 不支持常见的多字符转义 (MCE) 以及围绕它们构建的字符类. 通常可以按表 1 中示例所示进行替换.
| MCE/类: | 替换为: |
|---|---|
\S | [^ \t\n\r] |
[\S ] | [^\t\n\r] |
\d | [0-9] |
表 1: 多字符转义的替代示例
注意, 在 XSD 正则表达式中, \d 的语义是 \p{Nd}; 但这会包含各种书写系统中属于数字的所有 Unicode 字符, 而这几乎肯定不是 IETF 出版物所需要的.
构造 \p{IsBasicLatin} 本质上引用的是传统 ASCII; 它可以由字符类 [\u0000-\u007f] 替代.
5.2 XSD Regexps
任何 I-Regexp 也是 XSD regexp [XSD-2], 因此该映射是恒等函数.
注意, [XSD-2] 的一些勘误已在 [XSD-1.1-2] 中修复; 因此, 后者也列入规范性参考文献 (第 9.1 节). XSD 1.1 的实现普及程度低于 XSD 1.0, 而 XSD 1.0 的实现很可能包含这些错误修复; 就本规范的意图和目的而言, XSD 1.0 regexps 的实现等同于 XSD 1.1 regexps 的实现.
5.3 ECMAScript Regexps
对 I-Regexp 执行以下步骤, 可得到 ECMAScript regexp [ECMA-262]:
- 对字符类之外的任何未转义点号 (
.) (charClass 产生式的第一个替代项), 将点号替换为[^\n\r]. - 用
^(?:和)$包裹结果.
ECMAScript regexp 应解释为 Unicode 模式 ("u" 标志; 参见 [ECMA-262] 第 21.2.2 节 "Pattern Semantics").
注意, 在需要 regexp 字面量的地方, 实际 regexp 需要包在 / 中.
5.4 PCRE, RE2 和 Ruby Regexps
要在 Perl Compatible Regular Expressions (PCRE) [PCRE2], Go 编程语言的 RE2 regexp 库 [RE2], 以及 Ruby 编程语言中得到有效 regexp, 执行与第 5.3 节相同的步骤, 但最后一步为:
- 用
\A(?:和)\z包裹 regexp.