Tengo ese código repetitivo en el esquema xsd.

      <xs:attribute name="version" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="1.1"/>
            <xs:enumeration value="1.2"/>
            <xs:enumeration value="1.3"/>
            <xs:enumeration value="1.4"/>
            <xs:enumeration value="1.5"/>
            <xs:enumeration value="1.6"/>
            <xs:enumeration value="1.7"/>
            <xs:enumeration value="1.8"/>
            <xs:enumeration value="1.9"/>
            <xs:enumeration value="1.10"/>
            <xs:enumeration value="1.11"/>
            <xs:enumeration value="1.12"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>

Que simplemente quiero reemplazar con el patrón de la siguiente manera.

<xs:pattern value="1.[1-9]|[1-1][0-2]"/>

Pasa el 1.2 o 1.6 pero falla con "1.10". con lxml.etree.DocumentInvalid: Elemento 'sfd', atributo 'version': [facet 'pattern'] El valor '1.10' no es aceptado por el patrón '1. [1-9] | [1-1] [0 -2] '

Pensé que [1-9] | [1-1] [0-2] representa el rango entre 1-9 y 10-12.

¿Cuál es el problema?

2
pepero 23 jun. 2020 a las 18:02

2 respuestas

Su expresión regular (consulte su demo) coincide con una cadena que

  • 1.[1-9]: comienza con 1, luego tiene cualquier carácter que no sea un salto de línea y un dígito de 1 a 9
  • | - o
  • [1-1][0-2]: comienza con 1 (nota [1-1] = 1) y luego un dígito desde 0 hasta 2.

Puede usar

<xs:pattern value="1\.(1[0-2]|[1-9])"/>

Consulte la demostración de expresiones regulares. Teniendo en cuenta que el patrón de expresión regular del esquema XSD debe coincidir con toda la cadena, esto es lo que coincide:

  • 1 - coincide con 1
  • \.: coincide con un punto literal (. sin un símbolo de escape coincide con cualquier carácter excepto un carácter de salto de línea)
  • (1[0-2]|[1-9]): un grupo de captura (tenga en cuenta que la expresión regular del esquema XSD no admite los que no capturan) que coinciden con 10, 11, 12 o un dígito de 1 a 9 rango.
1
Wiktor Stribiżew 23 jun. 2020 a las 15:48

Prueba paréntesis:

<xs:pattern value="1\.([1-9]|1[0-2])"/>

Tenga en cuenta el "." Escapado, de lo contrario, coincidirá con cosas como 1 $ 12. Y creo que [1-1] probablemente está permitido, pero 1 parece más simple.

0
Michael Kay 23 jun. 2020 a las 15:52