我的XSD中有一个正则表达式模式可以解决问题,但可读性很差。
<xs:element name="short_description">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="|^([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&'':"nt%#£°€@=«»¦*`´-]){1,}$"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
因此,我试图将其分开如下,以获得更好的可读性(示例)
<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="|^([&$apos;"]){1,}$"/>
<xs:pattern value="|^([nt]){1,}$"/>
<xs:pattern value="|^([%#£°€@=«»¦*]){1,}$"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
重新运行我的 XSD 后,似乎他只在模式分离时查看第一行。
有没有办法使第一个模式(见上文)更具可读性?还是我在第二个例子中做错了什么?
您可以使用多种模式,但它们之间的关系是 OR 的关系,而不是 AND:
包含多个
<pattern>
元素的 XML<restriction>
在集合中产生单个 ·正则表达式·;此正则表达式是 ·正则表达式· 的"或",正则表达式是<pattern>
元素的内容。
如果您有[A-Za-z]+
然后[0-9]+
,则意味着您允许仅包含 1 个或多个字母(第一个)或 1+ 位数字(第二个)的值。这并不意味着您允许由 1 个或多个字母或数字组成的字符串。
在这种情况下,将模式编写为单个限制更安全:
<xs:pattern value="([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&':"nt%#£°€@=«»¦*`´-]+)?" />
请注意:
- 要使模式可选(即允许空匹配),使用可选组(
(<PATTERN>)?
)将整个模式括起来更安全 $apos;
应该'
- 默认情况下,XML 架构正则表达式是锚定的,不应使用
^
和$
- 要支持 Unicode 字母,您可以考虑只使用 Unicode 类别类
p{L}
。
允许有多个模式分面:如果这样做,输入必须与其中任何一个匹配。(这有点违反直觉,因为通常每个方面都定义一个限制性规则,你必须满足所有这些规则。
^
和$
不是XSD中的元字符:它们自己匹配。所以我看不出你的任何模式是如何工作的。(除非架构处理器不符合要求,遗憾的是,有时情况确实如此。
由于您的[a-zA-Z0-9...]
类包含大部分拉丁语-1,因此您可以考虑使用减法:[ -ÿ-[exceptions]]
,其中例外是要排除的拉丁语-1 字符列表。
在@WiktorStribiżew的帮助下,我找到了答案。
- 无法以我使用它的方式在 XSD 中拆分正则表达式
- 正则表达式也改进了 ->
([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&':"nt%#£$°€@=«»¦*
'-]+)?
-> 此正则表达式允许 1 到多个字符
-> 它还允许空标签