我正在尝试编写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:值&#34; H0&#34;无效作为模式的方面&#34; ^ [a-zA-z] [a-zA-Z0-9] * $&#34;对于类型nameType
我无法理解。在RegExr(/^[a-zA-z][a-zA-Z0-9]*$/gm
)上使用它可行。我在模式规范中遗漏了什么吗?
最后一个细节。验证错误由JAXB Java框架中的marshaller给出。
答案 0 :(得分:2)
您需要删除^
和$
,因为XSD patterns会隐式锚定,^
和$
不会在这些模式中用作锚点,并且会修复[a-zA-z]
字符类中的拼写错误,如果您需要匹配任何ASCII字母,则它应为[a-zA-Z]
(请参阅this related answer,[A-z]
不仅匹配ASCII字母)。< / p>
使用
<xsd:pattern value="[a-zA-Z][a-zA-Z0-9]*" />
此模式实际上与以下
匹配[a-zA-Z]
- 任何ASCII字母[a-zA-Z0-9]*
- 零个或多个ASCII字母和/或数字。