禁止字符串以空格开头或结尾的 XSD?

Posted

技术标签:

【中文标题】禁止字符串以空格开头或结尾的 XSD?【英文标题】:XSD that prohibits strings from starting or ending with whitespace? 【发布时间】: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 _.,']*$"/>

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

【问题讨论】:

【参考方案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 感谢您的评论,我不知道。 您好,感谢您的建议。 这适用于我的代码。

以上是关于禁止字符串以空格开头或结尾的 XSD?的主要内容,如果未能解决你的问题,请参考以下文章

比较字符串忽略开头或结尾处的空格

LINQ:选择任何字符串以某个字符开头的行

JS问题,去掉字符串的前后空格

C# 正则表达式 - 排除文本开头和结尾的下划线和空格

如何使用正则表达式匹配不以某些字符开头或结尾的单词?

Linux shell提取字符串,文件中以a开头以z结尾的所有字符串