Регулярное выражение не совпадает с конечным тегом XML. Я хочу выполнить определенную проверку для элементов XML, но одно из условий не выполняется - PullRequest
0 голосов
/ 25 сентября 2018

Я написал регулярное выражение в XSD для одного из элементов XML.Условия ниже: он не должен быть пустым или пробелом, или значение тега не должно содержать $, за которым следуют алфавиты.Пример:

1.<element>I am $A test</element>--- this is invalid.

2.<element>I am $a test</element>--- this is invalid.

3.<element></element>--- this is invalid.
4.<element>   </element>--- this is invalid.

5.<element>I am $123.0 test on 02/01/2018 ongoing </element>--- this is 
 valid.
6.<element>I am $123.0 test on 02/01/2018 ongoing 
  month for another year
  </element>--- this is valid.
7.<element>I am test</element>--- this is valid.

XSD:

Для проверки указанных условий я использую приведенное ниже регулярное выражение.но это не работает для тестового набора № 6. В тестовом примере № 6 конечный тег начинается с новой строки, что вызывает проблему.

<xs:element name="element" minOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:pattern value="([^$\s]*(\s*$\d[^$\s]*|\s+[^$\s]+)+|[^$\s]+ 
(\s*$\d[^$\s]*|\s+ 
[^$\s]*)*)" />
</xs:restriction>
</xs:simpleType>
</xs:element>

Could anybody help to correct the above regex.

1 Ответ

0 голосов
/ 25 сентября 2018

Хитрый бит здесь запрещает строку, содержащую '$', за которой следует алфавит.Я не смог придумать способ сделать это с обычным аспектом XSD-шаблона (что, конечно, не означает, что это невозможно).Это достаточно просто в XSD 1.1, где вы можете использовать функцию XPath matches() в утверждении для предоставления «отрицательного шаблона»:

<xs:assertion test="normalize-space($value) 
                    and not(matches($value, '\$[\p{L}]'))"/>

Для вызова normalize-space() требуется, чтобы строка содержала хотя бы один несимвол пробела.

...