3. I-Regexp Syntax (I-Regexp 语法)
3. I-Regexp Syntax (I-Regexp 语法)
I-Regexp 必须符合图 1 中的 ABNF 规范。
i-regexp = branch *( "|" branch )
branch = *piece
piece = atom [ quantifier ]
quantifier = ( "*" / "+" / "?" ) / range-quantifier
range-quantifier = "{" QuantExact [ "," [ QuantExact ] ] "}"
QuantExact = 1*%x30-39 ; '0'-'9'
atom = NormalChar / charClass / ( "(" i-regexp ")" )
NormalChar = ( %x00-27 / "," / "-" / %x2F-3E ; '/'-'>'
/ %x40-5A ; '@'-'Z'
/ %x5E-7A ; '^'-'z'
/ %x7E-D7FF ; skip surrogate code points
/ %xE000-10FFFF )
charClass = "." / SingleCharEsc / charClassEsc / charClassExpr
SingleCharEsc = "\" ( %x28-2B ; '('-'+'
/ "-" / "." / "?" / %x5B-5E ; '['-'^'
/ %s"n" / %s"r" / %s"t" / %x7B-7D ; '{'-'}'
)
charClassEsc = catEsc / complEsc
charClassExpr = "[" [ "^" ] ( "-" / CCE1 ) *CCE1 [ "-" ] "]"
CCE1 = ( CCchar [ "-" CCchar ] ) / charClassEsc
CCchar = ( %x00-2C / %x2E-5A ; '.'-'Z'
/ %x5E-D7FF ; skip surrogate code points
/ %xE000-10FFFF ) / SingleCharEsc
catEsc = %s"\p{" charProp "}"
complEsc = %s"\P{" charProp "}"
charProp = IsCategory
IsCategory = Letters / Marks / Numbers / Punctuation / Separators /
Symbols / Others
Letters = %s"L" [ ( %s"l" / %s"m" / %s"o" / %s"t" / %s"u" ) ]
Marks = %s"M" [ ( %s"c" / %s"e" / %s"n" ) ]
Numbers = %s"N" [ ( %s"d" / %s"l" / %s"o" ) ]
Punctuation = %s"P" [ ( %x63-66 ; 'c'-'f'
/ %s"i" / %s"o" / %s"s" ) ]
Separators = %s"Z" [ ( %s"l" / %s"p" / %s"s" ) ]
Symbols = %s"S" [ ( %s"c" / %s"k" / %s"m" / %s"o" ) ]
Others = %s"C" [ ( %s"c" / %s"f" / %s"n" / %s"o" ) ]
图 1: ABNF 中的 I-Regexp 语法
作为附加限制, 不允许 charClassExpr 匹配 [^], 根据此语法, 它将被解析为包含单个字符 ^ 的正字符类。
这本质上是一个没有以下内容的 XSD 正则表达式:
- 字符类减法 (Character Class Subtraction),
- 多字符转义 (Multi-Character Escapes), 如
\s,\S和\w, 以及 - Unicode 块 (Unicode Blocks)。
I-Regexp 实现必须是这个有限子集的完整实现。特别是, 需要完全支持本规范中定义的 Unicode 功能。实现:
- 绝对不能将自身限制为 7 位或 8 位字符集 (如 ASCII), 并且
- 必须支持字符类中的 Unicode 字符属性集。
3.1 Checking Implementations (检查实现)
检查 (Checking) I-Regexp 实现是指检查提供的正则表达式是否符合本规范并报告任何问题的实现。检查实现使其用户确信他们没有意外插入不可互操作的语法, 因此推荐进行检查。对于通过简单步骤 (例如执行第 5 节中讨论的映射操作) 将 I-Regexp 映射到另一个正则表达式库的低工作量实现, 可以例外。在这里, 进行完全检查所需的工作可能使其他实现工作相形见绌。实现应该记录它们是否正在进行检查。
使用 I-Regexp 的规范可能希望定义在哪些情况下其实现可以使用非检查的 I-Regexp 实现, 以及何时需要完全检查, 可能在定义其自己的实现类的过程中。