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>