【问题标题】:XSD that prohibits strings from starting or ending with whitespace?禁止字符串以空格开头或结尾的 XSD?
【发布时间】:2021-12-29 13:40:37
【问题描述】:

我们在加载 XML 文件之前使用 XSD 模式验证。因此,在使用 XSD 模式验证加载 XML 时,它接受字符串开头和结尾的空格。我们只需要限制字符串开头和结尾的空格。但是在字符串中间我们需要接受字符串之间的空格。

例如:SOMEXMLFIELD ="STACK OVER FLOW".

为此,我们为架构验证配置了以下 XSD 模式值。

例如:<xs:pattern value="^[A-Za-z0-9 _.,']*[A-Za-z0-9_.,']+[A-Za-z0-9 _.,']*$"/>

谁能建议我如何限制字符串开头和结尾的空格(注意:我们需要接受字符串之间的空格)? .

【问题讨论】:

    标签: regex xml xsd xsd-validation xml-validation


    【解决方案1】:

    这个 XSD,

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      elementFormDefault="qualified">
      <xs:element name="e">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="[^\s]?"/>
            <xs:pattern value="[^\s].*[^\s]"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:schema>
    

    将允许e 具有内部空格,但不能以空格开头或结尾。

    请注意,XSD 正则表达式模式是隐式锚定的,因此不要使用 ^$ 进行锚定。

    Reference:

    注意:不同于一些流行的正则表达式语言(包括 那些由 Perl 和标准 Unix 实用程序定义的),常规 此处定义的表达式语言隐式锚定所有正则 头部和尾部的表达式,作为正则的最常见用法 ·pattern· 中的表达式是匹配整个文字。


    更新: @Thefourthbird had a good point 应该允许 1 和 2 个不带前导/尾随空格的字符串。我也扔了空字符串。

    【讨论】:

      【解决方案2】:

      如果您还想允许匹配 1 和 2 个字符,您可以在不允许空格的情况下开始匹配,并且可以选择匹配任何字符,包括中间的空格,然后再次匹配没有空格的字符。

      [A-Za-z0-9_.,']([A-Za-z0-9 _.,']*[A-Za-z0-9_.,'])?
      

      Regex demo

      简而言之:

      [\w.,']([\w .,']*[\w.,'])?
      

      【讨论】:

      • 关于允许 1 或 2 个字符的好点。我更新了可能会回答并归功于您的观察。
      • 请注意,XSD 正则表达式模式会自动在前端和后端锚定,因此您不需要前导 ^ 和尾随 $
      • @kjhughes 感谢您的评论,我不知道。
      • 您好,感谢您的建议。
      • 这适用于我的代码。
      猜你喜欢
      • 1970-01-01
      • 2014-08-28
      • 2021-04-25
      • 2021-07-04
      • 2019-11-06
      • 2021-03-22
      相关资源
      最近更新 更多