2013-08-07 4 views
0

문자열 요소에 대한 제한 사항으로 XML 스키마에 사용할 RegEx 표현식을 만드는 데 약간의 어려움이 있습니다.XML 스키마의 RegEx 문자열 유효성 검사

HASCALCULATOR, LISTUPDATENEEDED, READ 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 스키마의 RegEx 표현식과 관련된 제한 사항을 확인하십시오. http://www.regular-expressions.info/xml.html

답변

0

몇 가지 옵션이 있습니다.

(1)은 다음과 같은 라인을 따라, 상당히 정교한 정규 표현식을 작성하여 기술 한 제약 조건을 적용 할 수 있습니다 :

  • 현재 네 개의 문자열 모든 법적 값이 일부 순열의 연결입니다 시퀀스 ("HASCALCULATOR", "읽기 전용", "리스트 업", "필수").
  • 4 개 미만의 문자열이있는 모든 유효한 값은 일부 순열의 연결 접두사입니다.

    <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?))?))) 
과 같이되도록의 분리를 인수 분해3210

(3) 자료의 재현을 다시 생각할 수 있습니다. 예를 들어, 4 개의 문자열 중 하나의 존재를 플래그로 처리하고 반복을 무시할 수 있습니다. 그것은 당신이 스케치 한 패턴과 같은 패턴을 허용합니다.

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

대신

당신이 뭔가를 작성하도록 (4) 당신은, 네 개의 부울 속성과 플래그를 나타낼 수 :

<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)을 사용하려고합니다. 그러나 질문의 ​​일반적인 느낌과 함께 모든 대문자 문자열과 결합하면 잘 설정된 시스템의 출력을 처리하고 형식을 변경하는 것이 실현 가능하지 않다고 생각합니다.