XSLT中Zelle元素接受手机号或邮箱的正则校验报错问题
XSLT Zelle元素内容校验正则修正方案
原正则存在的问题
你使用的[_\-a-zA-Z0-9\.\+][a-z|A-Z|0-9|@?](\.?[\-a-zA-Z0-9]*[a-zA-Z0-9])*存在三个核心问题:
- 字符组内的
|会被识别为字面量字符,不是逻辑或的含义,会错误允许|字符通过校验 - 没有对两种格式做分支判断,既无法限制手机号为10位纯数字,也无法保证邮箱必须包含
@和域名后缀 - 没有首尾锚定(XSD中默认全匹配,XSLT的matches函数默认部分匹配),会出现非法输入部分符合规则就校验通过的问题
修正后的校验规则
适用场景说明
- 如果是在XSLT的
matches()函数中使用,正则需要加首尾锚定 - 如果是在关联的XSD Schema的
pattern约束中使用,不需要加^和$(XSD默认全字符串匹配,加锚定反而会报错)
最终正则
XSLT matches函数用版本
^(?:\d{10}|[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$
XSD pattern约束用版本
(?:\d{10}|[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})
规则说明
\d{10}:匹配10位纯数字,符合你给出的手机号示例要求- 邮箱匹配规则遵循通用RFC标准,覆盖绝大多数常用邮箱格式,不会误拦截合法邮箱
- 用非捕获分组
(?:规则1|规则2)实现手机号和邮箱二选一的校验逻辑
使用示例
XSLT中校验代码示例:
<!-- 校验Zelle元素值是否合法 --> <xsl:choose> <xsl:when test="matches(Zelle, '^(?:\d{10}|[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$')"> <!-- 校验通过后的业务逻辑 --> </xsl:when> <xsl:otherwise> <!-- 校验不通过的报错逻辑 --> </xsl:otherwise> </xsl:choose>
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

