方面 'pattern' 的值 '<!\[CDATA\[.*?\]\]>|[^<>&]*' 不是有效的正则表达式

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

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

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

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

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

这是我的 xsd 代码(请注意,我必须将正则表达式中的 &<> 替换为 &lt; &gt;&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 模式中的工作方式有些我没有得到。

通过消除过程,我找到了修复方法。首先,我确定问题出在表达式的 <!\[CDATA\[.*?\]\]> 部分。所以我把它从我的表达中撕掉并慢慢地添加位直到我得到同样的错误。导致问题的字符是?。即使 CDATA 中没有任何内容,表达式在没有 ? 的情况下仍然有效。

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