在您的XSD文件中使用以下类型定义:
<xs:simpleType name="IPv4Address">
<xs:annotation>
<xs:documentation>IPv4 address in dot-decimal notation. Equivalent to [0-255].[0-255].[0-255].[0-255]</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" />
</xs:restriction>
</xs:simpleType>
这将仅接受每个由四个点分隔的字段中 0 到 255 的值。
该模式为:
((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])
这只是一个组合从句:
(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])
使用{3}
重复三次,后面加上一个带有\.
点的字符,然后再重复一次不带点的字符。
|
分割组匹配条件成三个备选项:
1?[0-9]?[0-9]
匹配从0到199之间的所有数字。
2[0-4][0-9]
匹配以2开头的三位数,从200到249。
25[0-5]
匹配250到255
一旦定义了类型,就可以在架构中像这样使用:
<xs:element name="Example">
<xs:complexType>
<xs:sequence>
<xs:element name="Address" maxOccurs="1" type="IPv4Address" />
</xs:sequence>
</xs:complexType>
</xs:element>
可以通过轻微更新原始正则表达式来处理边缘情况:
([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}
根据正则表达式的前两个部分,将验证1至99的数字。
1 digit: [1-9]
2 digits: [1-9][0-9]
0
,因此对于其中一个或两个字节使用类似于1[0-9]?[0-9]?|2[0-4][0-9]|25[0-5]
的模式可能更理想。 - TedB