2017-05-26 2 views
1

Ich habe ein Regex-Muster in meinem XSD, das den Trick macht, aber die Lesbarkeit ist schlecht.Aufgliederung von Regex-Mustern in XSD

<xs:element name="short_description"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="|^([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!\/çéÉêÊèÈëË +;&amp;&apos;':&quot;\n\t%#£°€@=«»¦*`´-]){1,}$"/> 
        </xs:restriction> 
       </xs:simpleType> 
</xs:element> 

Deshalb habe ich versucht, es als das folgende für eine bessere Lesbarkeit (Beispiel) zu trennen

<xs:element name="title"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <!-- Check the title with no limitation to size --> 
       <xs:pattern value="|^([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇçéÉêÊèÈëË]){1,}$"/> 
       <xs:pattern value="|^([.,?()!\/ +;':`´-]){1,}$"/> 
       <xs:pattern value="|^([&amp;$apos;&quot;]){1,}$"/> 
       <xs:pattern value="|^([\n\t]){1,}$"/> 
       <xs:pattern value="|^([%#£°€@=«»¦*]){1,}$"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 

Nach meinem XSD rerunning es scheint, dass er nur in der ersten Zeile suchen, wenn die Muster voneinander getrennt sind .

Gibt es eine Möglichkeit, das erste Muster (siehe oben) lesbarer zu machen? Oder mache ich im zweiten Beispiel etwas falsch?

+0

Sind Sie sicher, dass Ihre Muster funktionieren? Was soll der erste tun? Wofür steht '$ apos;'? Meinst Du "'"? Sieht aus wie Sie 1 regex verwenden müssen, [ '" [a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç,()/çéÉêÊèÈëË +; & ': " \ n \ t% # £ ° € @ = «» | * \.?! ''-] +" '] (https://regex101.com/r/GiXSXy/1) seit es in separate zu trennen ist einfach nicht dasselbe. –

+0

Ja, sie funktionieren und in der Tat musste es ' sein. Aber vielleicht sollten wir die Frage auslassen, ob es funktioniert oder nicht;) machen Sie es allgemeiner. Wenn Sie einen solchen Regex haben, können Sie ihn in mehrere Zeilen aufteilen? – Dragonix

+1

Sie können '[^ a-z0-9]' nicht einfach in '[^ a-z] | [^ 0-9]' aufteilen. Es bricht die gesamte Funktionalität und passt zu jedem Zeichen. –

Antwort

1

Sie können multiple patterns verwenden, aber die Beziehung zwischen ihnen ist, dass die OR, nicht UND:

Ein XML-<restriction> mehr als ein <pattern> Element enthält, führt zu einem einzigen · regulären Ausdruck · in der Gruppe; Dieser reguläre Ausdruck ist ein "oder" der regulären Ausdrücke, die den Inhalt der <pattern> Elemente darstellen.

Wenn Sie [A-Za-z]+ und dann [0-9]+, bedeutet dies, dass man Werte zulassen, die nur von 1 oder mehr Buchstaben bestehen (die ersten) oder von 1+ digits (die zweiten). Es bedeutet nicht, dass Sie eine Zeichenfolge aus 1 oder mehr Buchstaben oder Ziffern zulassen.

Es ist in diesem Fall sicherer, das Muster als eine einzige Einschränkung zu schreiben:

<xs:pattern value="([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&amp;&apos;:&quot;\n\t%#£°€@=«»¦*`´-]+)?" /> 

Beachten Sie, dass:

  • Um ein Muster zu machen optional (dh ein leeres Spiel ermöglichen) es ist sicherer das gesamte Muster mit einer optionalen Gruppe ((<PATTERN>)?)
  • $apos; sollte &apos;
  • XML Schema regex zu umschließen ps sind standardmäßig verankert, ^ und $ sollten nicht verwendet werden
  • Um Unicode-Buchstaben zu unterstützen, können Sie nur \p{L} Unicode-Kategorie-Klasse verwenden.
+0

Danke! Sehr geschätzt – Dragonix

+0

Ich wünschte, ich könnte, aber ich habe nicht genug Reputationspunkte zu upvote (ich brauche 15, also 5 übrig) – Dragonix

+0

Fertig, danke! Eine weitere Frage. Dieses '\ p {L}' klingt sehr interessant, aber ich kann keine guten Beispiele finden, wie man sie in meine Regex implementiert. Ich habe versucht '([\ p {L}] +)?' Aber ohne Erfolg. – Dragonix

0

Mit Hilfe von @ WiktorStribiżew konnte ich eine Antwort finden.

  1. Es ist nicht möglich, einen regulären Ausdruck in der XSD in der Art und Weise zu teilen, dass ich es
  2. Die Regex auch verbessert bin mit ->([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&amp;&apos;:&quot;\n\t%#£$°€@=«»¦* '-] +) `

? - > Diese Regex erlaubt 1 zu viele Zeichen

-> Es ermöglicht auch leere Tags

1

Es erlaubt ist, mehrere Muster Facetten zu haben: wenn Sie dies tun, muss der Eingang einen von ihnen entsprechen. (Das ist etwas kontraintuitiv, da normalerweise jede Facette eine einschränkende Regel definiert und Sie alle erfüllen müssen.)

^ und $ sind keine Meta-Zeichen in XSD: sie entsprechen sich. Ich kann also nicht sehen, wie eines Ihrer Muster möglicherweise funktionieren kann. (. Es sei denn, der Schema-Prozessor mit nicht-konformer ist, die leider manchmal der Fall ist)

Da Ihr [a-zA-Z0-9...] Klasse umfasst die meisten Latin-1, könnten Sie mit einer Subtraktion betrachten: [&#x20;-&#xff;-[exceptions]], wo Ausnahmen ist die Liste der Zeichen in Latin-1, das Sie ausschließen möchten.