2013-08-07 95 views
0

創建RegEx表達式以在XML Schema中使用作爲字符串元素的限制有一點挑戰。XML Schema中的RegEx字符串驗證

所面臨的挑戰是,字符串(現在)可以包含以下值:

HASCALCULATORLISTUPDATENEEDEDREAD ONLYMANDATORY

每個值只能出現一次,並且可以隨機排列。值由空格(空格)分隔。所有的值不需要存在。有效的字符串

例子:無效的字符串

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 Schemas中的RegEx表達式相關的限制,這裏描述如下:http://www.regular-expressions.info/xml.html

回答

0

您有幾個選項。

(1)你可以強制你寫一個相當複雜的正則表達式,大意如下描述的約束:

  • 與目前所有的四根弦每個合法值的某個置換的串聯序列(「HASCALCULATOR」,「只讀」,「列出來的」,「強制」)。
  • 每個出現少於四個字符串的合法值都是某個排列串聯的前綴。

    <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)少可以通過左製作詳細的版本:

所以,你可以通過計算你的四根弦的24個排列,並使後綴可選寫出來的正則表達式在全融通脫節,讓喜歡

(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)你可以代表標誌爲四個布爾屬性,因此,與其

<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),我自己。但是從問題的總體感覺來看,再加上全部大寫字符串,我想你正在處理來自完善系統的輸出,並且改變格式是不可行的。