否定匹配字符串的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

我希望XSD验证字符串的内容。具体来说,我想验证某个字符串是否没有出现

考虑这个规则,它将验证我的字符串是否出现。查找所有
链接
元素都以以下特定字符串开头:
/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'
你想否定这些事实的结合。现在,根据德摩根定律,~(a和b,…和z)等于(~a或~b或……或~z)。因此,您可以通过编写以下术语的析取来完成所需的操作:

    [^/].*
    |.([^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].*)?