【问题标题】:Splitting up regex pattern restriction in XSD在 XSD 中拆分正则表达式模式限制
【发布时间】:2017-05-26 13:08:23
【问题描述】:

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

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

重新运行我的 XSD 后,他似乎只在模式分离时查看第一行。

有没有办法让第一个模式(见上文)更具可读性?还是我在第二个例子中做错了什么?

【问题讨论】:

  • 您确定您的模式有效吗?第一个应该做什么? $apos; 代表什么?你的意思是&amp;apos;?看起来您需要使用 1 个正则表达式,"[a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&amp;amp;&amp;apos;:&amp;quot;\n\t%#£°€@=«»¦*`´-]+",因为将其分成不同的部分是不一样的。
  • 是的,它们有效,而且确实必须是 '。但也许我们应该忽略它是否有效的问题;)让它更普遍。如果你有这样的正则表达式,你能把它分成多行吗?
  • 您不能只将[^a-z0-9] 拆分为[^a-z]|[^0-9]。它破坏了整个功能并匹配任何字符。
  • 明白了,没有拆分正则表达式:-)。不过还有一个问题。在您的第一条评论中,您基本上将 '|^([...])$' 更改为 '[...]+'。这是为什么呢?
  • 好吧,至少不是字符类,当然也不是 XML 模式类。 XML Schema 正则表达式模式被锚定总是。你不需要^$,这些锚是多余的。要匹配包含3 的值,您需要编写".*3.*"。不知道| 是什么意思 - 值可能为空?最好使用可选组 - "(MY_PATTERN)?"

标签: regex xml validation xsd


【解决方案1】:

你可以使用multiple patterns,但它们之间的关系是OR,而不是AND:

包含多个&lt;pattern&gt; 元素的XML &lt;restriction&gt; 会在集合中产生一个·正则表达式·;此正则表达式是作为&lt;pattern&gt; 元素内容的正则表达式的“或”。

如果您有[A-Za-z]+,然后是[0-9]+,这意味着您允许仅包含 1 个或多个字母(第一个)或 1 个以上数字(第二个)的值。这并不意味着您允许包含 1 个或多个字母或数字的字符串。

在这种情况下,将模式写为单个限制会更安全:

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

请注意:

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

【讨论】:

  • 谢谢!非常感谢
  • 我希望可以,但我没有足够的声望点来投票(我需要 15 个,所以还剩 5 个)
  • 完成,谢谢!不过还有一个问题。这个\p{L} 听起来很有趣,但我找不到如何在我的正则表达式中实现它们的好例子。我尝试了([\p{L}]+)?,但没有成功。
  • 它被称为category escape \p{X}\p{L} 代表任何 Unicode 字母。您的正则表达式更复杂,您需要将除字母以外的所有其他支持的字符添加到[....]
  • 啊啊,现在我明白了。我只需要添加更多类别。例如:([\p{L}\p{Z}]+)?。我会检查您放置的链接,看看我也可以使用哪些类别。哇,谢谢大佬!
【解决方案2】:

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

^$ 不是 XSD 中的元字符:它们匹配自己。所以我看不出你的任何模式是如何工作的。 (除非模式处理器不符合标准,遗憾的是有时会出现这种情况。)

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

【讨论】:

    【解决方案3】:

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

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

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

    -> 也允许空标签

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 2019-04-14
      • 1970-01-01
      • 2021-10-07
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      相关资源
      最近更新 更多