XSD正则表达式模式:这个或者什么都没有

Ian*_*oyd 6 regex xsd xsd-validation

我正在尝试在XSD中定义一个方案规则,其中一个字符串长度为8个字符:

<PostedDate>42183296</PostedDate>
Run Code Online (Sandbox Code Playgroud)

和空间填充也是允许的:

<PostedDate>        </PostedDate>
Run Code Online (Sandbox Code Playgroud)

这让我进入了XSD:

<xs:simpleType name="DateFormat">
   <xs:restriction base="xs:string">
      <xs:length value="8" />            //exactly 8 characters long
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

但该值可以也是空的(即,零字符):

<PostedDate></PostedDate>
<PostedDate />
Run Code Online (Sandbox Code Playgroud)

这让我天真地尝试:

<xs:simpleType name="DateFormat">
   <xs:restriction base="xs:string">
      <xs:length value="8" />            //exactly 8 characters long
      <xs:length value="0" />            //exactly 0 characters long
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

当然不允许这样做.

与XSD中的情况一样,大多数格式都无法使用XSD轻松表示,因此我选择尝试使用正则表达式规则:

.{8} | ""
Run Code Online (Sandbox Code Playgroud)

尝试转换为XSD我输入:

<xs:simpleType name="DateFormat">
    <xs:restriction base="xs:string">
        <xs:pattern value=".{8}|''" />
    </xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

但它不起作用:

''20101111' is not facet-valid with respect to pattern '.{8}|''' for type 'DateFormat'
Run Code Online (Sandbox Code Playgroud)

我也试过了

  • <xs:pattern value="[0-9]{8}|''" />
  • <xs:pattern value="([0-9]{8})|('')" />
  • <xs:pattern value="(\d{8})|('')" />

可以解决问题的任何其他模式解决问题 - 某些特定模式 - 是空的

奖励:任何人都可以指向XSD文档\d与匹配数字匹配的位置吗?或者其他特殊模式代码是什么?

alp*_*use 11

我可能会猜测,模式应该看起来像是\d{8}|"八位数字或什么都没有",而不是八位数或两位数.但是这没有解释,为什么20101111不匹配.您确定元素值中没有空格或其他符号吗?
\d据说匹配"F.1.1角色类逃脱"部分中的数字

  • 同样重要的是要注意'xs:totalDigits`限制必​​须在**xs:pattern`限制之后**.否则,解析器在内部将文本"000001"转换为单个数字"1",然后无法验证模式`(\ d){6}`,因为它不是6个字符长! (2认同)