2

これは機能するはずですか?

私が使うとき

 <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>
4

1 に答える 1

1

あなたが持っているもの(?!foo)は、「ゼロ幅の負の先読みアサーション」と呼ばれます。「この場所に立って前を向いて、このパターンに一致しないことを確認してください」と書かれています。

このページによると、 XML スキーマpatternはあらゆる種類のルックアラウンド (正または負、前方または後方) をサポートしていません。

ただし、「目的は、文字列が特定の文字列で始まる場合ABC_PRODUCT_に、特定の文字列で終わるようにすることです。」見回す必要はありません。これを簡単に行うことができます:

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

これは、"foo"、"bar_jim"、"bar_jam" には一致しますが、"bar_zzz" には一致しません。

于 2012-04-23T16:25:45.817 に答える