在 XSD 中拆分正则表达式模式限制



我的XSD中有一个正则表达式模式可以解决问题,但可读性很差。

<xs:element name="short_description">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="|^([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&amp;&apos;':&quot;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="|^([&amp;$apos;&quot;]){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áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&amp;&apos;:&quot;nt%#£°€@=«»¦*`´-]+)?" />

请注意:

  • 要使模式可选(即允许空匹配),使用可选组((<PATTERN>)?)将整个模式括起来更安全
  • $apos;应该&apos;
  • 默认情况下,XML 架构正则表达式是锚定的,不应使用^$
  • 要支持 Unicode 字母,您可以考虑只使用 Unicode 类别类p{L}

允许有多个模式分面:如果这样做,输入必须与其中任何一个匹配。(这有点违反直觉,因为通常每个方面都定义一个限制性规则,你必须满足所有这些规则。

^$不是XSD中的元字符:它们自己匹配。所以我看不出你的任何模式是如何工作的。(除非架构处理器不符合要求,遗憾的是,有时情况确实如此。

由于您的[a-zA-Z0-9...]类包含大部分拉丁语-1,因此您可以考虑使用减法:[&#x20;-&#xff;-[exceptions]],其中例外是要排除的拉丁语-1 字符列表。

在@WiktorStribiżew的帮助下,我找到了答案。

  1. 无法以我使用它的方式在 XSD 中拆分正则表达式
  2. 正则表达式也改进了 ->([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&amp;&apos;:&quot;nt%#£$°€@=«»¦*'-]+)?

-> 此正则表达式允许 1 到多个字符

-> 它还允许空标签

最新更新