我正在尝试编写 XML 架构。具体要求我验证一个字段,使其以字母开头,后跟字母数字字符(例如 Foo3x4 有效,3Foo 或 Foo3_ 无效)。
我是这样写的:
<xsd:simpleType name="nameType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="^[a-zA-z][a-zA-Z0-9]*$" />
</xsd:restriction>
</xsd:simpleType>
但是,如果我尝试验证 nameType 值为 H0 的文档,则会出现以下错误(由我翻译成英文):
cvc-pattern-valid: The value "H0" is not valid as facet for the pattern "^[a-zA-z][a-zA-Z0-9]*$" for the type nameType
我不明白为什么。在 RegExr 上使用它(/^[a-zA-z][a-zA-Z0-9]*$/gm
),有效。我是否遗漏了模式规范中的某些内容?
最后一个细节。验证错误由 JAXB Java 框架中的编码器给出。
最佳答案
您需要删除 ^
和 $
作为 XSD patterns被隐式锚定,^
和 $
未用作这些模式中的 anchor ,并修复 [a-zA-z]
中的拼写错误字符类,如果需要匹配任何ASCII字母,应该是[a-zA-Z]
(参见this related answer,[A-z]
不仅匹配ASCII字母).
使用
<xsd:pattern value="[a-zA-Z][a-zA-Z0-9]*" />
这个模式实际上会匹配下面的
- 隐式匹配字符串的开头
[a-zA-Z]
- 任何 ASCII 字母[a-zA-Z0-9]*
- 零个或多个 ASCII 字母和/或数字。- 隐式匹配字符串结尾
关于java - XML 架构模式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47134570/