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