0

XML スキーマで文字列要素の制限として使用する RegEx 式を作成するのに少し苦労しました。

課題は、文字列 (現在) に次の値を含めることができることです。

HASCALCULATORLISTUPDATENEEDEDREAD ONLYおよびMANDATORY

各値は 1 回だけ出現する必要があり、ランダムな順序にすることができます。値はスペース (空白) で区切られます。すべての値が存在する必要はありません。

有効な文字列の例:

HASCALCULATOR LISTUPDATENEEDED READ ONLY MANDATORY
HASCALCULATOR READ ONLY
READ ONLY HASCALCULATOR
MANDATORY
<Blank streng>

無効な文字列の例:

READ ONLY HASCALCULATOR READ ONLY
SOMETHING READ ONLY
READ ONLY SOMETHING HASCALCULATOR LISTUPDATENEEDED READ ONLY MANDATORY

次のような表現をしました。

(HASCALCULATOR\s?|READONLY\s?|LISTUPDATENEEDED\s?|MANDATORY\s?){0,4}

しかし、すべてのケースを網羅しているわけではありません。たとえば、値の繰り返しを許可します。私を助けて、より良い表現を考え出すことができる人がいれば、私は感謝します. ここで説明されている XML スキーマの RegEx 式に関する制限に注意してください: http://www.regular-expressions.info/xml.html

4

1 に答える 1

0

いくつかのオプションがあります。

(1) 次の行に沿って、かなり精巧な正規表現を記述することで、説明した制約を適用できます。

  • 4 つの文字列すべてが存在するすべての有効な値は、シーケンスの順列 ("HASCALCULATOR"、"READ ONLY"、"LISTUPDATENEEDED"、"MANDATORY") の連結です。
  • 存在する文字列が 4 つ未満のすべての正当な値は、いくつかの順列を連結したプレフィックスです。

したがって、4 つの文字列の 24 の順列を計算し、接尾辞をオプションにすることで、正規表現を完全に書き出すことができます。

<xs:simpleType name="properties">
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="collapse"/>
    <xs:pattern value="((HASCALCULATOR (LISTUPDATENEEDED 
      (READ ONLY (MANDATORY)?)?)?)|(HASCALCULATOR 
      (LISTUPDATENEEDED (MANDATORY (READ ONLY)?)?)?)|(HASCALCULATOR 
      (READ ONLY (LISTUPDATENEEDED (MANDATORY)?)?)?)|(HASCALCULATOR
      (READ ONLY (MANDATORY (LISTUPDATENEEDED)?)?)?)|(HASCALCULATOR 
      (MANDATORY (LISTUPDATENEEDED (READ ONLY)?)?)?)|(HASCALCULATOR 
      (MANDATORY (READ ONLY 
      (LISTUPDATENEEDED)?)?)?)|(LISTUPDATENEEDED (HASCALCULATOR 
      (READ ONLY (MANDATORY)?)?)?)|(LISTUPDATENEEDED (HASCALCULATOR 
      (MANDATORY (READ ONLY)?)?)?)|(LISTUPDATENEEDED (READ ONLY 
      (HASCALCULATOR (MANDATORY)?)?)?)|(LISTUPDATENEEDED (READ ONLY 
      (MANDATORY (HASCALCULATOR)?)?)?)|(LISTUPDATENEEDED (MANDATORY 
      (HASCALCULATOR (READ ONLY)?)?)?)|(LISTUPDATENEEDED (MANDATORY 
      (READ ONLY (HASCALCULATOR)?)?)?)|(READ ONLY (HASCALCULATOR 
      (LISTUPDATENEEDED (MANDATORY)?)?)?)|(READ ONLY (HASCALCULATOR 
      (MANDATORY (LISTUPDATENEEDED)?)?)?)|(READ ONLY 
      (LISTUPDATENEEDED (HASCALCULATOR (MANDATORY)?)?)?)|(READ ONLY 
      (LISTUPDATENEEDED (MANDATORY (HASCALCULATOR)?)?)?)|(READ ONLY 
      (MANDATORY (HASCALCULATOR (LISTUPDATENEEDED)?)?)?)|(READ ONLY 
      (MANDATORY (LISTUPDATENEEDED (HASCALCULATOR)?)?)?)|(MANDATORY 
      (HASCALCULATOR (LISTUPDATENEEDED (READ ONLY)?)?)?)|(MANDATORY 
      (HASCALCULATOR (READ ONLY (LISTUPDATENEEDED)?)?)?)|(MANDATORY 
      (LISTUPDATENEEDED (HASCALCULATOR (READ ONLY)?)?)?)|(MANDATORY 
      (LISTUPDATENEEDED (READ ONLY (HASCALCULATOR)?)?)?)|(MANDATORY 
      (READ ONLY (HASCALCULATOR (LISTUPDATENEEDED)?)?)?)|(MANDATORY 
      (READ ONLY (LISTUPDATENEEDED (HASCALCULATOR)?)?)?))?">
      <xs:annotation>
        <xs:documentation>
          The pattern here was calculated this way.
          1 Let A = "HASCALCULATOR", B = "LISTUPDATENEEDED", 
            C = "READ ONLY", and D = "MANDATORY".
          2 Calculate the permutations of the sequence (A,B,C,D). 
            A sequence with four members has 4! = 24 permutations: 
            (A,B,C,D), (A,B,D,C), (A,C,B,D), (A,C,D,B), ...
          3 From each permutation generate a regex of the form
            (s1 (s2 (s3 (s4)?)?)?)
          4 Join all of these in single optional choice.
        </xs:documentation>
      </xs:annotation>
    </xs:pattern>
  </xs:restriction>
</xs:simpleType>

(2) 論理和を左因数分解することにより、より冗長なバージョンを生成できます。

(A (B, (C, (D)?)?)?)
|(A (B, (D, (C)?)?)?) 
|(A (C, (B, (D)?)?)?)
|(A (C, (D, (B)?)?)?)

のようなものになります

(A ((B ((C D?)|(D C?))? 
  | (C ((B D?)|(D B?))?)
  | (D ((B C?)|(C B?))?)))

(3)素材の表現を考え直すことができます。たとえば、4 つの文字列のいずれかの存在をフラグとして扱い、繰り返しを無視することができます。これにより、スケッチしたようなパターンが機能します。

(4) フラグを 4 つのブール属性として表すことができるため、代わりに

<xs:element name="properties" type="tns:properties"/>
<!--* assumes the declaration for 'properties' type
    * given above *-->

あなたは次のようなものを書きます:

<xs:element name="properties">
  <xs:complexType>
    <xs:attribute name="has-calculator" type="xs:boolean"/>
    <xs:attribute name="mandatory" type="xs:boolean"/>
    <xs:attribute name="read-only" type="xs:boolean"/>
    <xs:attribute name="list-update-needed" type="xs:boolean"/>
  </xs:complexType>
</xs:element>

(5) フラグを空の要素として表すことができます。これは、発生することによってプロパティを通知します。

<xs:complexType name="empty">
  <xs:sequence/>
</xs:complexType>
<xs:element name="properties">
  <xs:complexType>
    <xs:all>
      <xs:element name="has-calculator" 
                  type="tns:empty" minOccurs="0"/>
      <xs:element name="mandatory" 
                  type="tns:empty" minOccurs="0"/>
      <xs:element name="read-only" 
                  type="tns:empty" minOccurs="0"/>
      <xs:element name="list-update-needed" 
                  type="tns:empty" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
</xs:element>

私自身、オプション(5)を使用する傾向があります。しかし、すべて大文字の文字列と相まって、質問の一般的な感じから、十分に確立されたシステムからの出力を扱っており、形式を変更することは現実的ではないと思います。

于 2013-08-13T00:03:59.667 に答える