XSD正则表达式模式:这个或什么都没有
-
26-09-2019 - |
题
我正在尝试在 XSD 中定义一个方案规则,其中字符串长度为 8 个字符:
<PostedDate>42183296</PostedDate>
并且也允许空间填充:
<PostedDate> </PostedDate>
这让我想到了 XSD:
<xs:simpleType name="DateFormat">
<xs:restriction base="xs:string">
<xs:length value="8" /> //exactly 8 characters long
</xs:simpleType>
但价值 能 也可以是空的(即零字符长):
<PostedDate></PostedDate>
<PostedDate />
这导致我天真地尝试:
<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>
这当然是不允许的。
正如 XSD 中的常见情况,大多数格式无法轻松地用 XSD 表示,因此我选择尝试正则表达式规则:
.{8} | ""
尝试转换为 XSD 我输入:
<xs:simpleType name="DateFormat">
<xs:restriction base="xs:string">
<xs:pattern value=".{8}|''" />
</xs:restriction>
</xs:simpleType>
但这没有用:
''20101111' is not facet-valid with respect to pattern '.{8}|''' for type 'DateFormat'
我也尝试过
<xs:pattern value="[0-9]{8}|''" />
<xs:pattern value="([0-9]{8})|('')" />
<xs:pattern value="(\d{8})|('')" />
其他任何人都可以解决匹配问题的模式吗 - 一些特定的模式 -空
奖金: 谁能指出这个地方 XSD 文档 就是说 \d
匹配数字?或者还有哪些特殊的图案代码?
解决方案
我可能猜想模式应该看起来像 \d{8}|
这意味着“八位数字或什么都没有”,但不是八位数字或两个引号。但这并不能解释为什么 20101111
不匹配。您确定元素值中没有空格或其他附加符号吗?
\d
据说匹配“F.1.1 字符类转义”部分中的数字
其他提示
我也在同样的情况下允许空字符串,否则它必须是 6 个长度的数字。最后我用了像下面这样的。这对我有用
<xs:simpleType name="DateFormat">
<xs:restriction base="xs:string">
<xs:pattern value="|[0-9]{8}" />
</xs:restriction>
</xs:simpleType>
不隶属于 StackOverflow