模式验证中的正则表达式

时间:2015-03-12 15:20:08

标签: java regex xml validation xsd

我需要一个xml架构,它验证一个空节点和一个8位数的节点为true。所以我用以下简单类型定义了一个XML-Schema:

<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位数的标签?

感谢您的帮助, 安德烈亚斯

2 个答案:

答案 0 :(得分:5)

这将有效:

<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 Schema Regular Expressions page所说的:

  

特别值得注意的是完全没有像插入符号和美元,单词边界和环视一样的锚点。 XML模式始终隐式地锚定整个正则表达式。正则表达式必须匹配元素的整个元素才能被认为是有效的。

所以你的锚点显然导致正则表达式无法按预期运行。

答案 1 :(得分:1)

正如@dbank指出的那样,XSD中的正则表达式是隐式锚定的,$和^符号不会被识别为元字符。但是,一些XSD“实现”(所谓的)已经忽略了这里的规范,并且只是将所有正则表达式处理委托给一些不了解XSD规则的底层库。

我自己选择匹配零长度字符串或正好8位数的正则表达式(\d{8})?