Zum Hauptinhalt springen

3. I-Regexp Syntax (I-Regexp Syntax)

3. I-Regexp Syntax (I-Regexp Syntax)

Ein I-Regexp MUSS der ABNF-Spezifikation in Abbildung 1 entsprechen.

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" ) ]

Abbildung 1: I-Regexp-Syntax in ABNF

Als zusätzliche Einschränkung darf charClassExpr nicht mit [^] übereinstimmen, was gemäß dieser Grammatik als positive Zeichenklasse analysiert würde, die das einzelne Zeichen ^ enthält.

Dies ist im Wesentlichen ein XSD-Regexp ohne:

  • Zeichenklassensubtraktion (Character Class Subtraction),
  • Mehrfach-Zeichen-Escapes (Multi-Character Escapes) wie \s, \S und \w, und
  • Unicode-Blöcke (Unicode Blocks).

Eine I-Regexp-Implementierung MUSS eine vollständige Implementierung dieser begrenzten Teilmenge sein. Insbesondere ist vollständige Unterstützung für die in dieser Spezifikation definierte Unicode-Funktionalität ERFORDERLICH. Die Implementierung:

  • DARF NICHT auf 7- oder 8-Bit-Zeichensätze wie ASCII beschränkt sein, und
  • MUSS das Unicode-Zeicheneigenschaftsset in Zeichenklassen unterstützen.

3.1 Checking Implementations (Prüfende Implementierungen)

Eine prüfende (Checking) I-Regexp-Implementierung ist eine Implementierung, die einen bereitgestellten regulären Ausdruck auf Konformität mit dieser Spezifikation überprüft und Probleme meldet. Prüfende Implementierungen geben ihren Benutzern die Gewissheit, dass sie nicht versehentlich Syntax eingefügt haben, die nicht interoperabel ist, daher ist die Überprüfung EMPFOHLEN. Ausnahmen von dieser Regel können für Implementierungen mit geringem Aufwand gemacht werden, die I-Regexp durch einfache Schritte wie die Durchführung der in Abschnitt 5 diskutierten Zuordnungsoperationen einer anderen Regexp-Bibliothek zuordnen. Hier könnte der für die vollständige Überprüfung erforderliche Aufwand den Rest des Implementierungsaufwands in den Schatten stellen. Implementierungen SOLLTEN dokumentieren, ob sie eine Überprüfung durchführen oder nicht.

Spezifikationen, die I-Regexp verwenden, möchten möglicherweise definieren, in welchen Fällen ihre Implementierungen mit einer nicht prüfenden I-Regexp-Implementierung arbeiten können und wann eine vollständige Überprüfung erforderlich ist, möglicherweise im Prozess der Definition ihrer eigenen Implementierungsklassen.