我在XSD架构中有这样的样板代码。
<xs:attribute name="version" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="1.1"/>
<xs:enumeration value="1.2"/>
<xs:enumeration value="1.3"/>
<xs:enumeration value="1.4"/>
<xs:enumeration value="1.5"/>
<xs:enumeration value="1.6"/>
<xs:enumeration value="1.7"/>
<xs:enumeration value="1.8"/>
<xs:enumeration value="1.9"/>
<xs:enumeration value="1.10"/>
<xs:enumeration value="1.11"/>
<xs:enumeration value="1.12"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
我只想用以下模式替换。
<xs:pattern value="1.[1-9]|[1-1][0-2]"/>
它通过 1.2 或 1.6,但失败并显示"1.10"。 与 lxml.etree.文档无效: 元素 'sfd', 属性 'version': [facet 'pattern'] 模式 '1'不接受值 '1.10'。[1-9]|[1-1][0-2]'
我想 [1-9]|[1-1][0-2] 表示 1-9 和 10-12 之间的范围。
问题出在哪里?
您的正则表达式(请参阅其演示(匹配的字符串
1.[1-9]
- 以1
开头,然后具有除换行符字符和从1
到9
的数字以外的任何字符|
- 或[1-1][0-2]
- 以1
开头(注意[1-1]
=1
(,然后从0
到2
的数字。
您可以使用
<xs:pattern value="1.(1[0-2]|[1-9])"/>
请参阅正则表达式演示。请记住,XSD 架构正则表达式模式必须与整个字符串匹配,以下是它匹配的内容:
1
- 匹配1
.
- 匹配文字点(没有转义符号的.
匹配除换行符之外的任何字符((1[0-2]|[1-9])
- 捕获组(注意 XSD 架构正则表达式不支持非捕获组(匹配10
、11
、12
或从1
到9
范围的数字。
尝试使用括号:
<xs:pattern value="1.([1-9]|1[0-2])"/>
请注意转义的".",否则您将匹配 1$12 之类的内容。我认为[1-1]
可能是允许的,但1
似乎更简单。