Firebase规则中生日验证正则表达式适配问题
解决Firebase规则中生日正则验证的错误问题
这个问题我之前也碰到过,Firebase规则使用的是RE2正则引擎,而且对锚点^的使用有严格限制——它不允许在正则表达式的中间位置出现^,而你的原正则是把三个独立的完整匹配分支(每个都带^和$)用|拼接,这就导致了中间的^触发了错误提示。
具体调整步骤:
- 合并锚点:把所有匹配分支放到同一个
^(开头)和$(结尾)的包裹中,去掉每个分支单独的^和$,这样整个正则只做一次全字符串匹配,避免了多个^的问题。 - 正确转义反斜杠:在Firebase规则的JSON字符串里,单个反斜杠
\需要写成\\才能被正确解析,所以原正则里的\/、\1、\2等都要改成\\/、\\1、\\2。
修改后的Firebase规则代码:
".validate": "newData.isString() && newData.val().matches(/^(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[13-9]|1[0-2])\\2)|(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))|(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4)(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$/)",
验证逻辑说明:
修改后的正则和你原来的逻辑完全一致,依然能正确验证:
- 31天的月份(1、3、5、7、8、10、12月)的日期
- 30天的月份(4、6、9、11月)的日期
- 闰年2月29日的特殊情况
- 1-28日的通用日期格式
- 支持
/、-、.三种分隔符,且分隔符前后一致 - 年份支持1600年及以后的格式(两位或四位年份)
内容的提问来源于stack exchange,提问作者Ryan Dailey
相关产品推荐
相关产品推荐

