メインコンテンツまでスキップ

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),
  • \s, \S, \w などの複数文字エスケープ (Multi-Character Escapes), および
  • Unicode ブロック (Unicode Blocks)。

I-Regexp 実装は, この制限されたサブセットの完全な実装でなければなりません。特に, この仕様で定義されている Unicode 機能の完全なサポートが必須です。実装は:

  • ASCII などの 7 ビットまたは 8 ビット文字セットに制限してはならず,
  • 文字クラスで Unicode 文字プロパティセットをサポートしなければなりません。

3.1 Checking Implementations (チェック実装)

チェック (Checking) I-Regexp 実装とは, 提供された正規表現がこの仕様に準拠しているかをチェックし, 問題を報告する実装です。チェック実装は, ユーザーが誤って相互運用できない構文を挿入しなかったという確信を与えるため, チェックは推奨されます。このルールの例外は, セクション 5 で説明されているマッピング操作の実行などの簡単な手順で I-Regexp を別の正規表現ライブラリにマッピングする低労力の実装に対して行われる可能性があります。ここでは, 完全なチェックを行うために必要な労力が残りの実装労力を矮小化する可能性があります。実装は, チェックを行っているかどうかを文書化すべきです。

I-Regexp を使用する仕様は, その実装が非チェック I-Regexp 実装で動作できる場合と完全なチェックが必要な場合を定義することを望む場合があります。これは, 独自の実装クラスを定義するプロセスで行われる可能性があります。