繁体   English   中英

模式验证中的正则表达式

[英]Regular Expression in schema validation

我需要一个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位数的标签?

感谢帮助,安德烈亚斯

这将有效:

<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页面指出:

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

因此,您的锚点显然导致正则表达式无法按预期运行。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM