【问题标题】:Regular Expression in schema validation模式验证中的正则表达式
【发布时间】:2015-05-14 20:08:24
【问题描述】:

我需要一个 xml 模式,它验证一个空节点和一个 8 位数字的节点是否为真。所以我定义了一个具有以下简单类型的 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 位数字的标签?

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

【问题讨论】:

    标签: java regex xml validation xsd


    【解决方案1】:

    这将起作用:

    <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 模式总是隐含地锚定整个正则表达式。正则表达式必须匹配整个元素,该元素才被视为有效。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-03-03
        • 1970-01-01
        • 1970-01-01
        • 2019-08-03
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多