Nokogiri模式限制

时间:2012-04-23 09:43:57

标签: ruby xml xsd nokogiri

这应该有用吗?

当我使用

 <xs:pattern value="(!red|green|blue)"/>

一切都很好,但使用:

<xs:pattern value="(?!red|green|blue)"/>

(注意添加的“?”)

编辑:在另一个SO问题中发现了这个问题,它既不起作用

^((?!red|green|blue)|((red|green|blue).+)).*$

两个原因:

/home/asdf/.rvm/gems/ruby-1.9.3-p125@tretti_order/gems/nokogiri-1.5.2/lib/nokogiri/xml/schema.rb:37:in `from_document': Element '{http://www.w3.org/2001/XMLSchema}pattern': The value '(?!red|green|blue' of the facet 'pattern' is not a valid regular expression. (Nokogiri::XML::SyntaxError)
    from /home/asdf/.rvm/gems/ruby-1.9.3-p125@tretti_order/gems/nokogiri-1.5.2/lib/nokogiri/xml/schema.rb:37:in `new'
    from /home/asdf/.rvm/gems/ruby-1.9.3-p125@tretti_order/gems/nokogiri-1.5.2/lib/nokogiri/xml/schema.rb:8:in `Schema'
    from xml_validate.rb:12:in `<main>'

上下文

    <xs:simpleType name="attributeIdType">
    <xs:annotation>
      <xs:appinfo>Attribute Id Type.</xs:appinfo>
      <xs:documentation source="http://www.web3d.org/x3d/specifications/ISO-IEC-19775-1.2-X3D-AbstractSpecification/Part01/fieldsDef.html#SFDouble"/>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse"/>
      <xs:pattern value="(?!red|green|blue)"/>
    </xs:restriction>
  </xs:simpleType>

1 个答案:

答案 0 :(得分:1)

(?!foo)的内容称为"zero-width negative lookahead assertion";它说:“确保站在这个位置并向前看,你不能匹配这种模式。”

根据this page XML Schema pattern不支持任何形式的正面(正面或负面,向前或向后)。

但是,因为你说,“目的是确保如果一个字符串以ABC_PRODUCT_开头,它只以某个字符串结尾。”你不需要一个环视。你可以这样做:

pattern="(foo|bar_(jim|jam)"

这将匹配“foo”,“bar_jim”和“bar_jam”,但不匹配“bar_zzz”。