否定匹配字符串的XSD限制
我希望XSD验证字符串的内容。具体来说,我想验证某个字符串是否没有出现 考虑这个规则,它将验证我的字符串是否出现。查找所有否定匹配字符串的XSD限制,xsd,xsd-validation,Xsd,Xsd Validation,我希望XSD验证字符串的内容。具体来说,我想验证某个字符串是否没有出现 考虑这个规则,它将验证我的字符串是否出现。查找所有链接元素都以以下特定字符串开头:/site/example.com <xs:element name="Link" type="xs:normalizedString" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:pat
链接
元素都以以下特定字符串开头:/site/example.com
<xs:element name="Link" type="xs:normalizedString" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:pattern value="(/site/example\.com).*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
换句话说,上面的表达式验证所有Link
元素都以/site/example.com
开头。如何反转上面的表达式,以便**验证没有链接
元素以/site/example.com
开头
我尝试了以下regexp,但没有成功:/[^(site/example\.com)].
,因此这不起作用:
不工作策略1(单个字符的否定)
我知道这可能适用于否定单个字符,因为这个问题的作用是:
该问题中建议的模式
但在这种情况下,仅对单个字符求反不起作用,因为它将正确地失败:
/网址/example.com
但它也会错误地失败
/解决方案
不工作策略2(高级regexp前瞻)
根据这个SO问题(),您可以使用负前瞻(?!expr)
来解决这个问题
因此,这将在普通regexp中起作用:
^((?!/site/example.com)*$
现在,不幸的是xsd验证只支持有限的正则表达式。根据该网站,不支持lookaheads:
这几乎描述了我迄今为止所做的尝试
我的问题是,如何否定XSD模式中的正则表达式?您没有提到是否绑定到XML模式1.0和XPath 1.0,但如果没有,则可以使用xs:assert实现您的目标,大致如下(这可能需要一些工作-这来自内存…)
可能感兴趣的一些链接:
干杯,这在XSD1.1中更简单,在XSD1.1中,您可以使用断言来确保值不以指定的字符串开头。但从概念上讲,即使在XSD 1.0和简单的正则表达式中也足够简单:您希望确保字符串不以“
/site/example.com
”开头。如果它确实是以这种方式开始的,那么您将拥有关于字符串的一系列事实的逻辑连接:
- 子串(,,1,1)='/'
- 子字符串(,2,1)='s'
- 子字符串(,3,1)='i'
- 子字符串(.17,1)='m'
[^/].*
|.([^s].*)?
|.{2}([^i].*)?
|.{3}([^t].*)?
|.{4}([^e].*)?
|.{5}([^/].*)?
|.{6}([^e].*)?
|.{7}([^x].*)?
|.{8}([^a].*)?
|.{9}([^m].*)?
|.{10}([^p].*)?
|.{11}([^l].*)?
|.{12}([^e].*)?
|.{13}([^\.].*)?
|.{14}([^c].*)?
|.{15}([^o].*)?
|.{16}([^m].*)?
在上面的每个术语中,[^s]..
格式的子表达式已被包装在(…)?
--术语{2}([^i].*)
表示,如果第三个字符不是i
或根本没有第三个字符,则任何以两个字符开头的字符串都可以。这样可以确保长度小于17个字符的字符串不会被排除在外,即使它们恰好是禁止字符串的前缀
当然,要在XSD模式文档中使用它,需要删除所有空格,这使得正则表达式更难阅读
[此外,2016年6月]另请参见。非常感谢,我将不得不对此进行调查
[^/].*
|.([^s].*)?
|.{2}([^i].*)?
|.{3}([^t].*)?
|.{4}([^e].*)?
|.{5}([^/].*)?
|.{6}([^e].*)?
|.{7}([^x].*)?
|.{8}([^a].*)?
|.{9}([^m].*)?
|.{10}([^p].*)?
|.{11}([^l].*)?
|.{12}([^e].*)?
|.{13}([^\.].*)?
|.{14}([^c].*)?
|.{15}([^o].*)?
|.{16}([^m].*)?