我正在尝试为必须包含四个字母数字(仅限大写)的元素编写XML Schema数据类型,而不是全数字组合。
换句话说,是A-Z或0-9中的四个序列,包含至少一个A-Z。
后一部分我遇到了困难,至少有一个"至少有一个"或"但不是"。
我已经想过和/或尝试过:
字符类减法(但我认为没有办法定义"类"这里?)
<!-- no example -->
结合2个xs:限制
<xs:restriction>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9A-Z]{4}"/>
</xs:restriction>
</xs:simpleType>
<xs:pattern value="[^(\d\d\d\d)]"/>
</xs:restriction>
将2个xs:两种数据类型的模式组合在一起
<xs:simpleType name="4alpha-at-least-one-letter">
<xs:restriction base="my-namespace:FourAlphanumericsType">
<xs:pattern value="[^(\d\d\d\d)]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FourAlphanumericsType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9A-Z]{4}"/>
</xs:restriction>
</xs:simpleType>
我想这些都是死路一条,我在正则表达式世界中遗漏了一些东西,或者XML正则表达式可能不是最好的方法吗?
答案 0 :(得分:3)
XML Schema正则表达式不支持外观,因此您只能拼出正则表达式:
<xs:pattern value="[A-Z][A-Z0-9]{3}|[A-Z0-9][A-Z][A-Z0-9]{2}|[A-Z0-9]{2}[A-Z][A-Z0-9]|[A-Z0-9]{3}[A-Z]"/>
请参阅regex demo。
如果您还需要匹配小写字母,请将a-z
添加到ech [...]
(字符类)中。
答案 1 :(得分:2)
更新 :不要错过sergioFC's clever approach。我会在这里留下我的答案,因为它可能有任何有用的花絮,但sergioFC是最好的解决方案。
通过使用多种模式,可以在WiktorStribiżew的good idea(+1)上获得轻微的可读性改进:
<xs:simpleType name="AtLeastOneLetterInFourAlphaType">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z0-9]{3}"/>
<xs:pattern value="[A-Z0-9][A-Z][A-Z0-9]{2}"/>
<xs:pattern value="[A-Z0-9]{2}[A-Z][A-Z0-9]"/>
<xs:pattern value="[A-Z0-9]{3}[A-Z]"/>
</xs:restriction>
</xs:simpleType>
(在XSD中,多个模式代表交替。)
XSD 1.1的断言工具可以表示该值不能是数字的约束,这实际上要求伙伴模式中表达的至少一个字符为非数字:
<xs:simpleType name="AtLeastOneLetterInFourAlphaType">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z0-9]{4}"/>
<xs:assertion test="not($value castable as xs:integer)"/>
</xs:restriction>
</xs:simpleType>
答案 2 :(得分:2)
鉴于长度是固定的,另一个简单的解决方案是结合 xs:pattern 和 xs:length 限制:
<xs:simpleType name="x">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z0-9]*[A-Z][A-Z0-9]*"/>
<xs:length value="4"/>
</xs:restriction>
</xs:simpleType>