我正在尝试开发一个XSD模式,其类型只允许来自键盘的字符。
例如,我需要字母,数字和所有字符从键盘一样!、^、$、*、[、]等。是允许的,但是像§和©这样的字符是不允许的。所以,我只是指定了所有允许的字符,其中一些是转义的:
<xsd:simpleType name="some_type">
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
<xsd:maxLength value="2000"/>
<xsd:pattern value="[a-zA-Z0-9 \.,/<>\?;:"'`~!@#%\(\)\[\]{}_\+=\|\\&^$-*]{1,2000}"/>
</xsd:restriction>
</xsd:simpleType>
字符串
但是当我试图传递一个字符串时,比如:
<text>this is test ^$- </text>
型
我收到一个错误,该值不是该类型的正确值。
我应该如何修复XSD中的RegEx以允许所有来自键盘的字符?
2条答案
按热度按时间d6kp6zgx1#
您可以使用 character class intersection 语法。
您可以提供值的范围,然后提供该范围中不应包括的值。
例如,下面的代码将匹配所有字母,从大写 *
A
* 到小写 *z
*,对中的值 *[
* 到 * ``` * 求反。字符串
您可以只提供可打印的 ASCII 范围,以防止 *
§
* 和 *©
* 字符不在此范围内。范围为 *
!
* 到 *~
*。以下是可打印的 ASCII 字符的完整列表。
型
c9qzyr3d2#
我认为这里的问题是,您需要转义XSD Regex中第4次出现的
-
字符(接近末尾,就在*
之前):字符串
应该是这样
型
之后,您的输入:
this is test ^$-
应能正常验证。注意正则表达式的开头是
a-zA-Z0-9
?解析器可能将最后一个-
解释为另一个范围$-*
,就好像它说的是dollar sign to star
而不是dollar sign, hyphen, star
。顺便说一下,我使用Saxon和.NET Core 6来测试这个,两次对第4个
-
进行转义都很好。