XSD 中的受限号码需要正则表达式
Need regex for restricted numbers in XSD
我在 WSDL 中使用以下正则表达式进行限制
<xsd:simpleType name="cfNumberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="((?=(^\d{3,9}$)|(^[0]\d{9}$))(?=^(?!11)\d+))" />
</xsd:restriction>
</xsd:simpleType>
但它不起作用并给出错误
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>402</faultcode>
<faultstring>Body: wrong format of input: failed to compile: xmlFAParseAtom: expecting ')' , failed to compile: xmlFAParseAtom: expecting ')' , failed to compile: xmlFAParseRegExp: extra characters , Element '{http://www.w3.org/2001/XMLSchema}pattern': The value '((?=(\d{3,9})|([0]\d{9}))(?=^(?!11)\d+))' of the facet 'pattern' is not a valid regular expression.</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
但它按 PHP 的预期工作。
此表达式需要进行哪些更改才能起作用? ^
和 $
字符似乎有问题,因为 XSD.
不接受这些字符
这个正则表达式的逻辑如下:
它应该允许 3 到 10 位数字(不包括以 11 开头的数字)。当是10位时,应该从0开始。
这个定义cfNumberType
<xs:simpleType name="cfNumberType">
<xs:restriction base="xs:string">
<xs:pattern value="[023456789]\d{2,8}" />
<xs:pattern value="\d[023456789]\d{1,7}" />
<xs:pattern value="0\d{2,9}" />
</xs:restriction>
</xs:simpleType>
由三个 xs:patterns
组成,分别允许:
- 首位不带1的3到9位
- 3到9位没有1在第二位
- 10 位数字,首位为 0
这相当于您要求的逻辑。
测试XSD
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="r">
<xs:complexType>
<xs:sequence>
<xs:element name="n" maxOccurs="unbounded" type="cfNumberType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="cfNumberType">
<xs:restriction base="xs:string">
<xs:pattern value="[023456789]\d{2,8}" />
<xs:pattern value="\d[023456789]\d{1,7}" />
<xs:pattern value="0\d{2,9}" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
测试XML
<?xml version="1.0" encoding="UTF-8"?>
<r>
<!-- valid -->
<n>123</n>
<n>1234</n>
<n>12345</n>
<n>123456</n>
<n>1234567</n>
<n>12345678</n>
<n>0123456789</n>
<!-- invalid -->
<n/>
<n>0</n>
<n>01</n>
<n>111</n>
<n>1234567890</n>
<n>12345678901</n>
</r>
我在 WSDL 中使用以下正则表达式进行限制
<xsd:simpleType name="cfNumberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="((?=(^\d{3,9}$)|(^[0]\d{9}$))(?=^(?!11)\d+))" />
</xsd:restriction>
</xsd:simpleType>
但它不起作用并给出错误
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>402</faultcode>
<faultstring>Body: wrong format of input: failed to compile: xmlFAParseAtom: expecting ')' , failed to compile: xmlFAParseAtom: expecting ')' , failed to compile: xmlFAParseRegExp: extra characters , Element '{http://www.w3.org/2001/XMLSchema}pattern': The value '((?=(\d{3,9})|([0]\d{9}))(?=^(?!11)\d+))' of the facet 'pattern' is not a valid regular expression.</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
但它按 PHP 的预期工作。
此表达式需要进行哪些更改才能起作用? ^
和 $
字符似乎有问题,因为 XSD.
这个正则表达式的逻辑如下:
它应该允许 3 到 10 位数字(不包括以 11 开头的数字)。当是10位时,应该从0开始。
这个定义cfNumberType
<xs:simpleType name="cfNumberType">
<xs:restriction base="xs:string">
<xs:pattern value="[023456789]\d{2,8}" />
<xs:pattern value="\d[023456789]\d{1,7}" />
<xs:pattern value="0\d{2,9}" />
</xs:restriction>
</xs:simpleType>
由三个 xs:patterns
组成,分别允许:
- 首位不带1的3到9位
- 3到9位没有1在第二位
- 10 位数字,首位为 0
这相当于您要求的逻辑。
测试XSD
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="r">
<xs:complexType>
<xs:sequence>
<xs:element name="n" maxOccurs="unbounded" type="cfNumberType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="cfNumberType">
<xs:restriction base="xs:string">
<xs:pattern value="[023456789]\d{2,8}" />
<xs:pattern value="\d[023456789]\d{1,7}" />
<xs:pattern value="0\d{2,9}" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
测试XML
<?xml version="1.0" encoding="UTF-8"?>
<r>
<!-- valid -->
<n>123</n>
<n>1234</n>
<n>12345</n>
<n>123456</n>
<n>1234567</n>
<n>12345678</n>
<n>0123456789</n>
<!-- invalid -->
<n/>
<n>0</n>
<n>01</n>
<n>111</n>
<n>1234567890</n>
<n>12345678901</n>
</r>