Java 模式验证中的正则表达式
我需要一个xml模式,它验证一个空节点和一个8位为true的节点。因此,我使用以下简单类型定义了一个XML模式:Java 模式验证中的正则表达式,java,regex,xml,validation,xsd,Java,Regex,Xml,Validation,Xsd,我需要一个xml模式,它验证一个空节点和一个8位为true的节点。因此,我使用以下简单类型定义了一个XML模式: <xs:simpleType name="LeererStringOder8Zeichen"> <xs:restriction base="xs:string"> <xs:pattern value="(^$|\d{8})"/> </xs:restriction> </xs:simpleType&g
<xs:simpleType name="LeererStringOder8Zeichen">
<xs:restriction base="xs:string">
<xs:pattern value="(^$|\d{8})"/>
</xs:restriction>
</xs:simpleType>
我使用java.util.regex和Xerces的内部RegularExpression类尝试了这个正则表达式。两者都返回了真值。但是,当我在WS中使用这个simpleType(使用CXF实现)时,当我提交一个空字符串(例如)时,会出现一个验证错误。为什么?有人知道如何改变我的模式,让它接受一个空标记和一个包含8位数字的标记吗
谢谢你的帮助,
Andreas这将起作用:
<xs:simpleType name="LeererStringOder8Zeichen">
<xs:restriction base="xs:string">
<xs:pattern value="|\d{8}"/>
</xs:restriction>
</xs:simpleType>
|\d{8}
表示不匹配或八位数字。(您也可以使用|[0-9]{8}
)
似乎(^$|\d{8})
(尽管我认为你的意思是^(^$\d{8})$
)不起作用的原因是:
特别值得注意的是,完全没有插入符号和美元、单词边界和环视等锚点。XML模式始终隐式地锚定整个正则表达式。正则表达式必须与整个元素匹配,才能将元素视为有效元素
因此,您的锚定显然导致正则表达式无法按预期运行。正如@dbank指出的,XSD中的正则表达式是隐式锚定的,$和^符号不能识别为元字符。然而,一些XSD“实现”(所谓的)忽略了这里的规范,只是将所有正则表达式处理委托给一些不知道XSD规则的底层库 对于匹配零长度字符串或正好匹配8位数字的正则表达式,我自己的选择是
(\d{8})?