Regex XML模式中的正则表达式字符串验证
我在创建一个正则表达式以在XML模式中用作对字符串元素的限制时遇到了一点挑战 挑战在于字符串(现在)可以包含以下值:Regex XML模式中的正则表达式字符串验证,regex,validation,xsd,xsd-validation,restriction,Regex,Validation,Xsd,Xsd Validation,Restriction,我在创建一个正则表达式以在XML模式中用作对字符串元素的限制时遇到了一点挑战 挑战在于字符串(现在)可以包含以下值: hascaculator,LISTUPDATENEEDED,只读和强制 每个值只能出现一次,并且可以是随机顺序。价值观由空格(空格)分隔。所有价值观不需要在场 有效字符串的示例: HASCALCULATOR LISTUPDATENEEDED READ ONLY MANDATORY HASCALCULATOR READ ONLY READ ONLY HASCALCULATO
hascaculator
,LISTUPDATENEEDED
,只读
和强制
每个值只能出现一次,并且可以是随机顺序。价值观由空格(空格)分隔。所有价值观不需要在场
有效字符串的示例:
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模式中的正则表达式相关的限制,如下所述:您有几个选项 (1) 您可以通过编写一个相当复杂的正则表达式来强制执行所描述的约束,方法如下:
- 所有四个字符串都存在的每个合法值都是序列排列的串联(“HASCALCULATOR”、“READ ONLY”、“LISTUPDATENEEDED”、“Emmandable”)
- 存在少于四个字符串的每个合法值都是某些排列的串联前缀
<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>
变得有点像
(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),我自己。但从问题的总体感觉来看,再加上所有大写字符串,我猜您正在处理一个完善系统的输出,更改格式是不可行的
<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>