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



我正在尝试使用regex来使用xsd验证xml中的字段。我想出了regex来做我想要做的事情,即除非文本被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>

因此,我认为regex在xsd模式中的工作方式有些我不了解的地方。

通过消除过程,我找到了解决方案。首先我确定问题在<![CDATA[.*?]]>部分的表达式中。所以我把这个从我的表达式中删除,慢慢地加回来,直到我得到同样的错误。造成问题的原因是?。即使CDATA中没有任何内容,表达式在没有?的情况下仍然有效。

我不确定1(为什么我得到该模式的人包括它,2(为什么xsd不允许它出现在我的模式中?

最新更新