YANG模型密码Pattern配置报错,寻求解决方法
解决YANG模型密码正则报错的方案
你的问题出在两个核心点:
- YANG字符串中,
\d这类转义序列需要额外转义,且XML Schema 1.0正则不支持\d预定义字符类,必须用[0-9]替代; - 你使用的
(?=...)正向先行断言属于Perl风格正则特性,XML Schema 1.0不支持该语法,这是导致语法错误的主要原因。
推荐用YANG的must语句结合简单pattern来实现密码复杂度要求,这种方式逻辑清晰、兼容性强:
leaf password { type string { # 限制密码仅包含允许的字符类型 pattern '[A-Za-z0-9#$@!%&*?]+'; } # 检查密码长度至少8位 must "string-length(.) >= 8" { error-message "密码长度不能少于8位"; } # 检查包含至少一个小写字母 must "matches(., '[a-z]')" { error-message "密码必须包含至少一个小写字母"; } # 检查包含至少一个大写字母 must "matches(., '[A-Z]')" { error-message "密码必须包含至少一个大写字母"; } # 检查包含至少一个数字 must "matches(., '[0-9]')" { error-message "密码必须包含至少一个数字"; } # 检查包含至少一个指定特殊字符 must "matches(., '[#$@!%&*?]')" { error-message "密码必须包含至少一个特殊字符(#$@!%&*?)"; } }
方案优势:
pattern用于过滤非法字符,确保密码仅由允许的类型组成;- 每个
must语句对应一个复杂度要求,逻辑直观,且错误提示明确; - 完全符合YANG规范,不会出现正则语法兼容性问题。
如果你的YANG编译器支持XML Schema 1.1(部分新工具支持),也可以使用支持正向断言的正则,但需注意转义规则(不过兼容性较差,不推荐通用场景):
leaf password { type string { pattern '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[#$@!%&*?])[A-Za-z0-9#$@!%&*?]{8,}$'; } }
内容的提问来源于stack exchange,提问作者getsoubl
相关产品推荐
相关产品推荐

