【问题标题】:The value '<!\[CDATA\[.*?\]\]>|[^<>&]*' of the facet 'pattern' is not a valid regular expressionfacet 'pattern' 的值 '<!\[CDATA\[.*?\]\]>|[^<>&]*' 不是有效的正则表达式
【发布时间】:2015-07-17 18:27:19
【问题描述】:

我正在尝试使用正则表达式来使用 xsd 验证我的 xml 中的字段。我想出了正则表达式来做我想做的事情,即禁止特殊字符,除非文本包含在 CDATA 标记中。这是我想出的正则表达式:

<!\[CDATA\[.*?\]\]>|[^<>&]*

当我在 http://regexr.com/ 上测试它以匹配我的模式时效果很好。问题是当我尝试将其插入 simpleType 模式限制时,我收到一条错误消息,指出它不是有效的正则表达式。

The value '&lt;!\[CDATA\[.*?\]\]&gt;|[^&lt;&gt;&amp;]*' of the facet 'pattern' is not a valid regular expression.

这是我的 xsd 代码(请注意,我必须将正则表达式中的 & 替换为 &amp;lt; &amp;gt; 和 &amp;amp; 以便它是有效的 xml):

<xs:element name="description" minOccurs="1" maxOccurs="1">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:pattern value="&lt;!\[CDATA\[.*?\]\]&gt;|[^&lt;&gt;&amp;]*"/>          
        </xs:restriction>
    </xs:simpleType>
</xs:element>

所以我认为正则表达式在 xsd 模式中的工作方式有些我没有得到。

【问题讨论】:

    标签: regex xsd cdata


    【解决方案1】:

    通过消除过程,我找到了解决办法。首先,我确定问题出在表达式的&lt;!\[CDATA\[.*?\]\]&gt; 部分。所以我把这个从我的表达中撕下来,慢慢地添加一些位,直到我得到同样的错误。导致问题的字符是?。即使 CDATA 中没有任何内容,该表达式在没有 ? 的情况下仍然有效。

    我不确定 1) 为什么我从中获得该模式的人包含它,以及 2) 为什么 xsd 不允许它出现在我的模式中?

    【讨论】:

    • 这是非贪心运算符,它选择最小的,而不是最大的,匹配。我不知道您的 XSD 解析器使用什么正则表达式引擎。我不认为所有引擎都有?但是,标准的 Java 引擎可以
    • 感谢您的澄清。这就是正则表达式如此令人沮丧的原因。一切都取决于您的环境。在我的情况下,没有非贪婪它可以正常工作,所以我会坚持下去。
    • .*? 实际上是无效的正则表达式。 .* 表示它已经是可选的。 (即,您正在寻找零个或多个匹配项,并且您无法获得比这更多的选择!)。 -- 你还应该注意正则表达式是贪婪的——所以如果你有多个 CDATA,这个表达式将从第一个开始匹配,直到第二个才结束(因为这就是 .* 所做的) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    相关资源
    最近更新 更多