Я работаю над файлом XSD для файлов XML, которые необходимо отправить в устаревшую систему. Эта устаревшая система имеет ограничения размера поля, указанные в # кодовых единицах UTF-16.
Например, поле description
может содержать не более 35 кодовых единиц UTF-16.
Я сейчас пытаюсь придумать регулярное выражение, которое можно вставить в XSD, чтобы оно ограничивало значение соответствующего поля не более чем 35 единицами кода UTF-16.
MyПервая попытка была такой:
<xs:element name="description">
<xs:annotation>
<xs:documentation>A description for the document</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:annotation>
<xs:documentation>A sequence of up to 35 UTF-16 code units</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="^(|([\x{0}-\x{FFFF}][\x{0}-\x{FFFF}]|[\x{10000}-\x{10FFFF}]){0,17}[\x{0}-\x{FFFF}]?|[\x{0}-\x{FFFF}]?([\x{0}-\x{FFFF}][\x{0}-\x{FFFF}]|[\x{10000}-\x{10FFFF}]){0,17})$"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Некоторая предыстория этого регулярного выражения:
- Символ BMP (базовая многоязычная плоскость) (
[\x{0}-\x{FFFF}]
) представлен в виде одного UTF-Кодовая единица 16. - Символ астральной плоскости (
[\x{10000}-\x{10FFFF}]
) представляется в виде двух кодовых единиц UTF-16 (в качестве суррогатной пары).
Моя (неудачная) идея быладля реализации этого ограничения:
- Существует не более 17 групп, которые являются либо a) парой символов BMP, либо b) одним символом астральной плоскости.
- Это не более 17группам может предшествовать или следовать один символ BMP.
Но, очевидно, это не работает для строк типа a?a?a
, где между двумя символами астральной плоскости находится один символ BMP.
Возможно, существует другой способ реализации ограничения дляколичество единиц кода UTF-16 в файле XSD?