3. I-Regexp Syntax (Sintassi I-Regexp)
3. I-Regexp Syntax (Sintassi I-Regexp)
Un I-Regexp DEVE conformarsi alla specifica ABNF nella Figura 1.
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" ) ]
Figura 1: Sintassi I-Regexp in ABNF
Come ulteriore restrizione, a charClassExpr non è consentito corrispondere a [^], che, secondo questa grammatica, sarebbe analizzato come una classe di caratteri positiva contenente il singolo carattere ^.
Questa è essenzialmente un'espressione regolare XSD senza:
- sottrazione di classe di caratteri (Character Class Subtraction),
- escape multi-carattere (Multi-Character Escapes) come
\s,\Se\w, e - blocchi Unicode (Unicode Blocks).
Un'implementazione I-Regexp DEVE essere un'implementazione completa di questo sottoinsieme limitato. In particolare, è RICHIESTO il supporto completo per la funzionalità Unicode definita in questa specifica. L'implementazione:
- NON DEVE limitarsi a set di caratteri a 7 o 8 bit come ASCII, e
- DEVE supportare il set di proprietà dei caratteri Unicode nelle classi di caratteri.
3.1 Checking Implementations (Implementazioni di controllo)
Un'implementazione I-Regexp di controllo (Checking) è un'implementazione che verifica la conformità di un'espressione regolare fornita con questa specifica e segnala eventuali problemi. Le implementazioni di controllo danno ai loro utenti la certezza di non aver inserito accidentalmente una sintassi non interoperabile, quindi il controllo è RACCOMANDATO. Eccezioni a questa regola possono essere fatte per implementazioni a basso sforzo che mappano I-Regexp a un'altra libreria di espressioni regolari mediante semplici passaggi come l'esecuzione delle operazioni di mappatura discusse nella Sezione 5. Qui, lo sforzo necessario per eseguire un controllo completo potrebbe mettere in ombra il resto dello sforzo di implementazione. Le implementazioni DOVREBBERO documentare se stanno effettuando o meno il controllo.
Le specifiche che utilizzano I-Regexp potrebbero voler definire in quali casi le loro implementazioni possono funzionare con un'implementazione I-Regexp senza controllo e quando è necessario un controllo completo, eventualmente nel processo di definizione delle proprie classi di implementazione.