정규표현식 xsd(C#)의 정규 표현식과 일치하는 문자열의 가능한 최대 길이 계산



정규표현식 그룹 (3)

다음 정의를 사용합니다.

<xs:simpleType name="ST_exactly8digitsString">
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{8}"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="ST_upto8digitsString">
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{0,8}"/>
    </xs:restriction>
</xs:simpleType>

이 모든 것들의 유효성을 검사 할 것입니다 :

<upto8digitsString>12345678</upto8digitsString>
<upto8digitsString>12345</upto8digitsString>
<exactly8digitsString>12345678</exactly8digitsString>

이들은하지 않을 것이다 :

<exactly8digitsString>12345</exactly8digitsString>
<upto8digitsString>123456789</upto8digitsString>

비록 당신이 찾고있는 것 같아요 :

<xs:simpleType name="ST_anyNoDigitsString">
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]*"/>
    </xs:restriction>
</xs:simpleType>

이 모든 것이 일치합니다.

<anyNoDigitsString>12345678900000000</anyNoDigitsString>
<anyNoDigitsString>88</anyNoDigitsString>
<anyNoDigitsString></anyNoDigitsString>
<anyNoDigitsString>0</anyNoDigitsString>

다른 .Net 정규 표현식과 비교할 때 XML 스키마 정규식 은 기능이 제한됩니다 . 이들 요소는 전체 요소가 패턴과 일치하는지 여부를 검증하는 용도로만 사용됩니다. Afaik, greedy 한정 기호 ?, *, +{n,m} 만 허용됩니다.

XSD로 작업 중이며 XSD의 패턴을 문자열로 액세스 할 수 있습니다. 예 :

<xsd:pattern value="[0-9]{8}"/>

나에게 C # 문자열을 준다.

string pattern = "[0-9]{8}";

XSD (유효한 XSD 패턴 항목이 될 수 있음)에서 얻은 패턴 문자열에서 XML의 필드 내용을 가능한 최대 길이만큼 처리하려고합니다.

이 간단한 예제에서는 분명히 8입니다. {n}을 확인하고 그 길이를 가정하여 파악할 수있었습니다. 다른 패턴에서는 * 또는 +를 확인하고 제한이없는 것으로 가정 할 수도 있지만이 작업을 수행하는 데 사용할 수있는 좀 더 일반적인 방법을 찾고 있습니다.

패턴 문자열은 .Net의 Regex 클래스와 호환된다는 보장은 없습니다.

어떤 도움이된다면 XSD를 먼저 구문 분석하는 데 사용하는 XmlSchemaPatternFacet 클래스에 액세스 할 수도 있습니다.

제공 할 수있는 도움에 감사드립니다.


Answer #1

이것을 달성하기 위해 정규식을 구문 분석해야 할 필요가 거의 확실합니다. 예를 들어, Saxon (정규식을 구현하는)에서 오픈 소스 정규 표현식 파서를 사용할 수 있습니다. 이렇게하면 하위 표현식 트리가 만들어지고 트리의 각 노드에 대해 최대 일치 길이를 계산하는 메서드를 추가 할 수 있습니다. 트리의 노드를 나타내는 Operation 클래스는 이미 (9.6에서) getMatchLength()getMinimumMatchLength() 메서드를 가지며 동일한 방식으로 작동하는 getMaximumMatchLength() 를 추가하기가 쉽습니다.


Answer #2

내 짐작으로는 매우 어려울 것입니다. 내장 된 중괄호를 사용하면 패턴 길이를 반복적으로 검색해야합니다.

편집 : 귀하의 요구 사항에 맞는 것으로 보이는 https://github.com/moodmosaic/Fare 를 찾았습니다.

var regex = @"((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)";
var xeger = new Xeger(regex);

var result = Regex.IsMatch(xeger.Generate(), regex);

또한 나는 가능한 가장 큰 답변을 찾지 못 하겠지만 시작일 수 있습니다.





xsd