XSD RegEx只允许键盘上的所有字符

oxf4rvwz  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(94)

我正在尝试开发一个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 \.,/&lt;&gt;\?;:&quot;'`~!@#%\(\)\[\]{}_\+=\|\\&amp;^$-*]{1,2000}"/>
  </xsd:restriction>
</xsd:simpleType>

字符串
但是当我试图传递一个字符串时,比如:

<text>this is test ^$- </text>


我收到一个错误,该值不是该类型的正确值。
我应该如何修复XSD中的RegEx以允许所有来自键盘的字符?

d6kp6zgx

d6kp6zgx1#

您可以使用 character class intersection 语法。
您可以提供值的范围,然后提供该范围中不应包括的值。
例如,下面的代码将匹配所有字母,从大写 * A * 到小写 * z *,对中的值 * [ * 到 * ``` * 求反。

[A-z&&[^\[-`]]+

字符串

  • "...我需要字母,数字和所有字符从键盘一样!、^、$、、[、]等。是允许的,但是像§和©这样的字符是不允许的。..."

您可以只提供可打印的 ASCII 范围,以防止 * § * 和 * © * 字符不在此范围内。
范围为 * ! * 到 * ~ *。
以下是可打印的 ASCII 字符的完整列表。

  • Wikipedia.org - ASCII -可打印字符 *。
[!-~]+

c9qzyr3d

c9qzyr3d2#

我认为这里的问题是,您需要转义XSD Regex中第4次出现的-字符(接近末尾,就在*之前):

[a-zA-Z0-9 \.,/&lt;&gt;\?;:&quot;'`~!@#%\(\)\[\]{}_\+=\|\\&amp;^$-*]{1,2000}

字符串
应该是这样

[a-zA-Z0-9 \.,/&lt;&gt;\?;:&quot;'`~!@#%\(\)\[\]{}_\+=\|\\&amp;^$\-*]{1,2000}


之后,您的输入:this is test ^$-应能正常验证。
注意正则表达式的开头是a-zA-Z0-9?解析器可能将最后一个-解释为另一个范围$-*,就好像它说的是 dollar sign to star 而不是dollar sign, hyphen, star
顺便说一下,我使用Saxon和.NET Core 6来测试这个,两次对第4个-进行转义都很好。

相关问题