0

我有一个 XSD 架构,其中包含特定字段的规则以匹配以下正则表达式:

\d{8}[\-]?[A-Za-z]{0,3}

使用 irb,我可以使用这个正则表达式进行测试,并且以下字符串都匹配,这是正确的:

12345678
12345678-
12345678-abc
12345678abc

当我尝试针对此 XSD 验证某些 XML 时,我得到的行为略有不同:

Passes:
12345678-
12345678-abc
12345678abc

Fails:
12345678

这是一个最小的 XSD/XML 文件,它重现了这个:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:simpleType name="codeType">
  <xs:restriction base="xs:token">
   <xs:pattern value="\d{8}[\-]?[A-Za-z]{0,3}"/>
  </xs:restriction>
 </xs:simpleType>
 <xs:element name="test">
  <xs:complexType>
   <xs:sequence>
    <xs:element type="codeType" name="code"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

和 XML:

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <code>11034755</code>
</test>

并运行它

xmllint --schema test.xsd test.xml

Element 'code': [facet 'pattern'] The value '11034755' is not accepted by the pattern '\d{8}[\-]?[A-Za-z]{0,3}'

虽然 XML 模式没有完整的正则表达式,但我认为这应该是有效的。在这种特殊情况下,对于 XSD 文件中的正则表达式,关于“??

4

1 回答 1

0

使用 Rubular 测试/\d{8}-?(?:[a-zA-Z]{3})?/我得到所有字符串的命中。

交替地/\d{8}[a-zA-Z-]*/,/\d{8}[a-z-]*/i/\d{8}[a-z-]{0,4}/i工作也。

您可以使用{0,3}这些{,3}可能会有所帮助。

于 2013-05-22T00:21:59.533 回答