对于 xsd:token 和 xsd:string 验证完全相同的字符串集的正则表达式是什么?

What is the regular expression for the set of strings that validate exactly the same for xsd:token and xsd:string?

我想写一个 XSD 来限制 xsd:token 类型的有效 XML 元素的内容,这样在验证时它们将与 [=47= 中包含的相同内容无法区分].

即它们不包含回车 return (#xD)、换行符 (#xA) 或制表符 (#x9),以 space (#x20) 字符开头或结尾,并且不包含两个或多个相邻 space 个字符的序列。

我认为要使用的正则表达式是这样的:

\S+( \S+)*

(一些非白人space,可选[一个或多个非白人space旁边的单个space],包括总是非白人space 关闭)

这适用于各种正则表达式测试工具,但我似乎无法使用 oXygen XML 编辑器对其进行检查;双 spaces、前导和尾随 spaces、制表符和字符串中的换行符似乎允许 XML 实例仍然通过验证。

这是 XSD 实施:

<xs:simpleType name="Tokenized500Type">
    <xs:restriction base="xs:token">
      <xs:maxLength value="500"/>
      <xs:minLength value="1"/>
      <xs:pattern value="\S+( \S+)*"/>
    </xs:restriction>
  </xs:simpleType>

有什么特点吗

这会阻止此工作?

您的原始 ([^\s])+( [^\s]+)*([^\s])* 正则表达式包含一些冗余模式:它匹配并捕获 1+ 非白色 spaces 的每次迭代,然后匹配 0+ 序列 space 和 1 + non-whitespaces,然后再次尝试匹配并捕获非whitespace的每次迭代。

您可以使用类似但更短的

\S+( \S+)*

由于 XML 架构正则表达式默认锚定,因此表达式匹配:

  • \S+ - 除了 whitespace 以外的一个或多个字符,特别是 &#20; (space), \t (tab), \n(换行符)和\r(return)
  • ( \S+)* - space 和 1+ 白色 space 的零个或多个序列。

此表达式不允许在 leading/trailing 位置出现重复的连续 space 和没有 space。

正则表达式的使用方法如下:

<xs:simpleType name="Tokenized500Type">
  <xs:restriction base="xs:string">
    <xs:pattern value="\S+( \S+)*"/>
    <xs:maxLength value="500"/>
    <xs:minLength value="1"/>
  </xs:restriction>
</xs:simpleType>

基本类型需要是xsd:string。

使用 xsd:Token 标记输入,然后检查它是否是标记。那是多余的。