Соответствие одному символу внутри более длинной ограниченной строки в RegEx / XSD - PullRequest
1 голос
/ 28 марта 2012

Я не знаю, насколько это выполнимо, но я работаю над типом данных для XSD, и одна из вещей, которые я пытаюсь сделать, - это расширить его, чтобы включить дефис в фамилии. Так что это должно соответствовать Smith Fry и Safran-Foer. Кроме того, я хотел бы ограничить длину проверяемой строки не более чем 100 (или 101) символами. Мой Regex первоначально был:

 <xsd:pattern value="[a-zA-Z ]{0,100}"/>

Теперь я знаю, что могу сделать что-нибудь, где я разбью это и произвольно разрешу 50 символов с каждой стороны, как:

 <xsd:pattern value="[a-zA-Z ]{0,50}(\-)?[a-zA-Z ]{0,50}"/>

Но это кажется неблагодарным. Есть ли способ сделать что-то вроде:

 <xsd:pattern value="[a-zA-Z (\-)?]{0,100}"/>

Еще один способ спросить о том, что я ищу, это «Сопоставить строку символов длиной от 0 до 100, содержащую не более 1 дефиса».

Спасибо!

1 Ответ

2 голосов
/ 28 марта 2012

Это колебание на 'Match a string of characters between 0 and 100 long with no more than 1 hyphen in it' плюс некоторые дополнительные ограничения:

  • допускает пробел
  • не может начинаться или заканчиваться дефисом

Я не думаю, что вы могли бы сделать максимальную длину в шаблоне, учитывая синтаксис, поддерживаемый регулярным выражением XSD;однако его легко объединить с фасетом maxLength.

Это XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="last-name">
        <xsd:simpleType>
            <xsd:restriction base="xsd:string">
                <xsd:maxLength value="100"/>
                <xsd:pattern value="[a-zA-Z ]+\-?[a-zA-Z ]+"/>
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:element>
</xsd:schema>

Шаблон может быть дополнительно уточнен, чтобы запретить дефис, окруженный только пробелами, и т. д..

Действительный XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<last-name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">last - name</last-name>

Недопустимый XML (слишком много дефисов) и сообщение:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<last-name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">l-ast - name</last-name>

ОШИБКА проверки:

Error occurred while loading [], line 3 position 121 The 'http://tempuri.org/XMLSchema.xsd:last-name' element is invalid - The value 'l-ast - name' is invalid according to its datatype 'String' - The Pattern constraint failed.

Неверный XML (больше, чем max, для тестов, которые я использовал maxLength = 14) и сообщение:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<last-name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">last - name that is longer</last-name>

Ошибка проверки:

Error occurred while loading [], line 3 position 135 The 'http://tempuri.org/XMLSchema.xsd:last-name' element is invalid - The value 'last - name that is longer' is invalid according to its datatype 'String' - The actual length is greater than the MaxLength value.

...