2016-04-26 9 views
0

Ich muss eine Anforderung erfüllen, nur Werte in Form von MM/TT/YYYY zu akzeptieren.Wie reguläre Ausdruck Muster im XSD-Schema ordnungsgemäß zu entkommen?

Von dem, was ich gelesen habe auf: https://www.w3.org/TR/xmlschema11-2/#nt-dateRep Mit

<xs:simpleType name="DATE"> 
     <xs:restriction base="xs:date"/> 
    </xs:simpleType> 

funktionieren wird nicht als regex ist offenbar dieses Format nicht unterstützt.

Ich habe gefunden, und dieses Format angepasst:

^(?:(?:(?:0?[13578]|1[02])(\/)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 

Zu diesem Formular:

\^\(\?:\(\?:\(\?:0\?\[13578\]\|1\[02\]\)\(\\/\)31\)\1\|\(\?:\(\?:0\?\[1,3-9\]\|1\[0-2\]\)\(\\/\)\(\?:29\|30\)\2\)\)\(\?:\(\?:1\[6-9\]\|\[2-9\]\d\)\?\d{2}\)$\|\^\(\?:0\?2\(\\/\)29\3\(\?:\(\?:\(\?:1\[6-9\]\|\[2-9\]\d\)\?\(\?:0\[48\]\|\[2468\]\[048\]\|\[13579\]\[26\]\)\|\(\?:\(\?:16\|\[2468\]\[048\]\|\[3579\]\[26\]\)00\)\)\)\)$\|\^\(\?:\(\?:0\?\[1-9\]\)\|\(\?:1\[0-2\]\)\)\(\\/\)\(\?:0\?\[1-9\]\|1\d\|2\[0-8\]\)\4\(\?:\(\?:1\[6-9\]\|\[2-9\]\d\)\?\d{2}\)$ 

Jetzt nicht mehr ich ungültig erhalten Fehler in XML-Editoren zu entkommen (unter Verwendung von XML Spy), aber ich dieser:

Ich habe die Flucht nach den XML-Schema-Spezifikationen hier gemacht: https://www.w3.org/TR/xmlschema-2/#regexs Abschnitt F.1.1 Es gibt eine Escape-Tabelle.

Kann jemand bitte helfen, dies zu nageln, richtig?

Danke!

+0

XSD Regex weiß nicht '^' und '$', und ich denke, Sie müssen '/' nicht entkommen. Versuchen Sie '(? :(? :(? :(?: 0? [13578] | 1 [02]) (/) 31) \ 1 | (? :(?: 0? [13-9] | 1 [0 -2]) (/) (?: 29 | 30) \ 2)) (? :(?: 1 [6-9] | [2-9] \ d)? \ D {2}) | (?: 0? 2 (/) 29 \ 3 (? :(? :(?: 1 [6-9] | [2-9] \ d)? (?: 0 [48] | [2468] [048] | [ 13579] [26]) | (? :(?: 16 | [2468] [048] | [3579] [26]) 00)))) | (? :(?: 0? [1-9]) | (?: 1 [0-2])) (/) (?: 0? [1-9] | 1 \ d | 2 [0-8]) \ 4 (? :(?: 1 [6-9] | [2-9] \ d)? \ D {2})) ' –

+0

Nicht funktioniert, es gibt mir diesen Fehler: Unerwarteter-MetaChar: Die Metazeichen". "," \ ","? "," * ", "+", "{", "}", "(", ")", "|", "[" und "]" können an dieser Position nicht uncapsiert auftreten. – Carmageddon

+0

Bitte beachten Sie, dass das von mir in der ursprünglichen Frage vorgeschlagene maskierte Formular einen anderen Fehler ergab: invalid-escape: Das angegebene Zeichen Escape wird nicht erkannt. was bedeuten könnte, dass ich irgendwo irgendwie definieren muss, was der Escape-Charakter ist. – Carmageddon

Antwort

1

Wenn Sie die XSD regex Syntax resources überprüfen, werden Sie feststellen, dass es keine Unterstützung für non-capturing groups ist ((?:...)), noch backreferences (die \n wie Entitäten auf den Text mit der Erfassung Gruppen gefangen zu beziehen, (...)).

Da das einzige Trennzeichen / ist, können Sie die Rückreferenz vollständig loswerden.

Verwenden

((((0?[13578]|1[02])/31)/|((0?[13-9]|1[0-2])/(29|30)/))((1[6-9]|[2-9]\d)?\d{2}‌​)|(0?2/29/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[35‌​79][26])00))))|(0?[1-9]|1[0-2])/(0?[1-9]|1\d|2[0-8])/(1[6-9]|[2-9]\d)?\d{2}) 

Siehe this regex demo

Beachten Sie, dass gem. zu regular-expressions.info:

Particularly noteworthy is the complete absence of anchors like the caret and dollar, word boundaries, and lookaround. XML schema always implicitly anchors the entire regular expression. The regex must match the whole element for the element to be considered valid.

So sollten Sie nicht ^ (Beginn der Zeichenfolge) und $ (Ende string) in XSD regex verwenden.

Das / Symbol wird in Regex-Varianten entkommen, wo es ist ein regex Begrenzer und in XSD regex, es gibt keine regex Begrenzungszeichen (als die einzige Aktion ist übereinstimmt, und es gibt keine Modifikatoren: XML schemas do not provide a way to specify matching modes) . So, nicht entkommen / in XSD Regex.

TESTS BEI ONLINE TESTERS HINWEIS

Wenn Sie bei regex101.com oder ähnlichen Seiten zu testen, beachten Sie, dass in den meisten Fällen die / entkommen müssen, wenn sie als regex Begrenzer aktiviert ist. Sie können die \ vor / sicher entfernen, nachdem Sie den Test abgeschlossen haben.

1

OK, so dass Sie von diesem Start sind (Ich werde Zeilenumbrüche zur besseren Lesbarkeit eingefügt):

^(?:(?:(?:0?[13578]|1[02])(\/)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/) 
(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 
|^(?:0?2(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$| 
^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 

Horrendous Sachen. Jetzt in XSD:

(a) gibt es keine ^ und $ Anker, sie sind nicht erforderlich (das Muster ist implizit verankert). Also nimm sie raus. Sie haben reagiert, indem Sie sie als \^ und \$ entkommen, aber das macht keinen Sinn: Sie wollen nicht wirklich Zirkumflexe und Dollarzeichen in Ihrer Eingabe.

(b) XSD erkennt nichtfangende Gruppen (?:xxxx) nicht. Ersetzen Sie sie einfach durch das Erfassen von Gruppen - entfernen Sie also die ?:. Auch hier sind Sie den Fragezeichen entgangen, was überhaupt keinen Sinn ergibt.

(c) Die \d wahrscheinlich [0-9] sein sollte, es sei denn, Sie tatsächlich Nicht-ASCII-Ziffern (zB Thai oder Ost-arabischen Ziffern) übereinstimmen soll

(d) Slash (/) muss nicht entgangen sein und tatsächlich kann nicht entgangen werden. Ersetzen Sie also \/ durch /.

(e) Ich sehe einige Rückverweise, \1, \2, \4. XSD-Regex erlauben keine Rückverweise. Aber soweit ich das beurteilen kann, dienen die Rückbezüge in diesem Regex keinem nützlichen Zweck. Die meisten von ihnen scheinen Rückverweise auf eine Gruppe der Form (\/) zu sein, die nur einen einzelnen Schrägstrich abgleichen kann, so dass die Rückseitenreferenz \1 einfach durch / ersetzt werden kann. Vielleicht sind sie Rückschlüsse auf eine frühere Form der Regex, die alternative Begrenzer erlaubte, aber sie konsistent machte.

Von Ihren Versuchen, die Probleme hier zu beheben, scheint es mir, dass Sie ein sehr umfassendes Verständnis der regulären Ausdrücke nicht haben. Ich fürchte, dass Sie, um das zu erreichen, in den sauren Apfel beissen müssen und lernen müssen, wie es funktioniert. Das Debuggen komplexer regulärer Ausdrücke ist schwierig, und Sie werden es nicht durch Versuch und Irrtum richtig verstehen.