这应该有效吗?
当我使用
<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>
你对(?!foo)
所拥有的被称为"零宽度负前瞻断言";它说"确保,站在这个地方向前看,你不能匹配这个模式。
根据此页面,XML Schema 的pattern
不支持任何类型的查找(正或负,向前或向后)。
但是,既然你说,"目的是确保如果一个字符串以ABC_PRODUCT_
开头,它只以某个字符串结尾。您可以简单地执行此操作:
pattern="(foo|bar_(jim|jam)"
这将匹配"foo"、"bar_jim"和"bar_jam",但不会匹配"bar_zzz"。