XSD正则表达式为"四个字母数字,但不是所有数字"?

时间:2016-10-28 08:32:42

标签: regex xml xsd logic alphanumeric

我正在尝试为必须包含四个字母数字(仅限大写)的元素编写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正则表达式可能不是最好的方法吗?

3 个答案:

答案 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是最好的解决方案。

XSD 1.0

通过使用多种模式,可以在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

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>