对于 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>
有什么特点吗
- XML
或
- XSD
或
- oXygen XML 编辑器
这会阻止此工作?
您的原始 ([^\s])+( [^\s]+)*([^\s])*
正则表达式包含一些冗余模式:它匹配并捕获 1+ 非白色 spaces 的每次迭代,然后匹配 0+ 序列 space 和 1 + non-whitespaces,然后再次尝试匹配并捕获非whitespace的每次迭代。
您可以使用类似但更短的
\S+( \S+)*
由于 XML 架构正则表达式默认锚定,因此表达式匹配:
\S+
- 除了 whitespace 以外的一个或多个字符,特别是 
(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 标记输入,然后检查它是否是标记。那是多余的。
我想写一个 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>
有什么特点吗
- XML
或
- XSD
或
- oXygen XML 编辑器
这会阻止此工作?
您的原始 ([^\s])+( [^\s]+)*([^\s])*
正则表达式包含一些冗余模式:它匹配并捕获 1+ 非白色 spaces 的每次迭代,然后匹配 0+ 序列 space 和 1 + non-whitespaces,然后再次尝试匹配并捕获非whitespace的每次迭代。
您可以使用类似但更短的
\S+( \S+)*
由于 XML 架构正则表达式默认锚定,因此表达式匹配:
\S+
- 除了 whitespace 以外的一个或多个字符,特别是
(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 标记输入,然后检查它是否是标记。那是多余的。