寻求适配xsd:NMTOKEN定义的正则表达式编写方案
适配xsd:NMTOKEN的正则表达式实现指南
别担心,刚上手正则的时候确实容易被各种规则绕晕,我来一步步帮你搞定xsd:NMTOKEN的正则匹配问题!
首先咱们再明确一遍xsd:NMTOKEN的核心规则,避免理解偏差:
- 是单个非空字符串令牌
- 允许的字符:字母(大小写/Unicode都算)、数字、句点
.、连字符-、下划线_、冒号: - 首尾空白会被自动移除(whiteSpace facet为collapse),但字符串内部绝对不能有空白
- 可以用任意允许的字符开头
基础ASCII版本正则
如果只需要支持英文字母和阿拉伯数字,用这个就够了:
^[A-Za-z0-9._:-]+$
我来拆解一下每个部分的作用:
^:匹配字符串的起始位置,确保从第一个字符就符合规则[A-Za-z0-9._:-]:定义允许的字符集合——大小写英文字母、0-9数字、以及.、_、-、:这几个符号(注意把-放在集合的最后,这样就不用转义,避免被当成范围符号)+:表示前面的字符集合至少出现1次,保证令牌非空$:匹配字符串的结束位置,确保整个字符串里没有超出允许范围的字符
支持Unicode字母/数字的版本
如果需要支持其他语言的字母(比如中文、法语、西班牙语的特殊字母)或者非阿拉伯数字,就用Unicode属性类的正则:
^[\p{L}\p{N}._:-]+$
\p{L}:匹配任意Unicode字母(包括各种语言的大小写字母)\p{N}:匹配任意Unicode数字(比如罗马数字、阿拉伯数字等)
注意:不同正则引擎对Unicode属性的支持不一样,比如JavaScript里需要加上
u标志才能生效,写法是/^[\p{L}\p{N}._:-]+$/u
关于空白处理的重要提醒
xsd的collapse规则是说先移除首尾空白,再检查内容,所以你在应用正则之前,需要先对输入做两步处理:
- 移除输入字符串的首尾空白(比如用编程语言里的
trim()方法) - 检查处理后的字符串是否为空——空字符串不符合NMTOKEN的要求
- 最后用上面的正则匹配处理后的字符串,确保没有内部空白和非法字符
合法/非法示例
- 合法的NMTOKEN:
User_123、prod.v2、order-789、xml:lang - 非法的NMTOKEN:
myToken(未处理首尾空白)、hello world(内部有空格)、@admin(包含非法字符@)、``(空字符串)
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

