2016-10-31 38 views
1

Я хочу написать XSD, чтобы ограничить содержимое допустимых элементов XML типа xsd: token таким образом, чтобы при проверке они были бы неотличимы от того же содержимого, заключенного в xsd: string.Каково регулярное выражение для набора строк, которое точно подтверждает то же самое для xsd: token и xsd: string?

I.e. они не содержат символы возврата каретки (#xD), строки (#xA) и символы табуляции (# x9), начинаются или заканчиваются символом пробела (# x20) и не включают в себя последовательность из двух или более смежных пространств персонажи.

Я думаю, что регулярное выражение для использования заключается в следующем:

\S+(\S+)* 

(некоторые непробельные, необязательные [единичные пространства рядом с одним или более не непечатаемыми], в том числе всегда непробельный закрыть)

Это работает с различными инструментами тестирования регулярных выражений, но я не могу проверить его с помощью редактора XML oXygen; двойные пробелы, начальные и конечные пробелы, вкладки и разрывы строк в строках, по-видимому, позволяют экземпляру XML по-прежнему проходить проверку.

Вот реализация XSD:

<xs:simpleType name="Tokenized500Type"> 
    <xs:restriction base="xs:token"> 
     <xs:maxLength value="500"/> 
     <xs:minLength value="1"/> 
     <xs:pattern value="\S+(\S+)*"/> 
    </xs:restriction> 
    </xs:simpleType> 

Есть ли какая особенность

  • XML

или

  • XSD

или

  • Oxygen XML редактор

что предотвращает эту работу?

+0

Если вы используете регулярное выражение non XML Schema, вам нужно '^ \ S + (\ s \ S +) * $'. В регулярном выражении XML Schema привязки не нужны - '\ S + (\ s \ S +) *' –

+0

Спасибо, это в контексте проверки XSD, поэтому я использовал обычный синтаксис XML Schema без^и $. Вы видите, почему моя более длинная версия выше не работает? И как бы '\ S + (\ s \ S +) *' исключить, например. разрывы строк и вкладки? '\ S' включает в себя как' \ n', так и '\ t' – Michael

+0

Привет @ WiktorStribiżew - я думаю, что это регулярное выражение, которое мне нужно, спасибо за то, что оно было менее подробным:' \ S + (\ S +) * '- обратите внимание сингл преднамеренно буквальный «космический» характер. – Michael

ответ

1

Ваш оригинальный ([^\s])+([^\s]+)*([^\s])* регулярное выражение содержит некоторые избыточные модели: она соответствует и захватывает каждую итерацию 1+ не-непечатаемых, затем сопоставляет 0+ последовательности пространства и 1+, не являющиеся пробельные, а затем снова сопоставляет и захват каждая итерация не-пробелов.

Вы можете использовать аналогичный, но короче

\S+(\S+)* 

Поскольку XML Schema регулярное выражение привязывается по умолчанию, выражение соответствует:

  • \S+ - один или несколько других, чем пробельных символов, в частности &#20; (пробел), \t (табл.), \n (новая линия) и \r (возвращение)
  • (\S+)* - ноль или м рудные последовательности пространства и 1 + пробелы.

Это выражение запрещает дублирование последовательных пробелов и пробелов в ведущем/конечном положении.

Вот как следует использовать регулярное выражение:

<xs:simpleType name="Tokenized500Type"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="\S+(\S+)*"/> 
    <xs:maxLength value="500"/> 
    <xs:minLength value="1"/> 
    </xs:restriction> 
</xs:simpleType> 
+0

Я пробовал это, но почему-то «живое» регулярное выражение в XSD (теперь также в вопросе) просто игнорирует это ... ohhhhhhhhhhhhh .... потому что он токенизирован и THEN проверен, является ли он токеном (подсказка: он был обозначен) ?! – Michael

+1

Я добавил код, как его следует использовать в ответе. –

1

Базовый тип должен быть XSD: строка.

Использование xsd: Token tokenizes вход, THEN проверяет, является ли он токеном. Это избыточно.