首页 > 解决方案 > Firebase 规则正则表达式生日

问题描述

我正在尝试使用以下正则表达式验证生日:

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{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})$

这个正则表达式在在线正则表达式测试器中测试时有效,但是当我尝试在我的 Firebase 规则中使用这个正则表达式时,Firebase 似乎不接受它。我还尝试将反斜杠加倍,但仍然没有运气。

这是我的火力基地规则:

".validate": "newData.isString() && newData.val().matches(/^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{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})$/)"

这是我在 Firebase 上遇到的错误:“非法正则表达式,未转义的 ^,^ 只能出现在正则表达式的末尾”

如何调整此正则表达式以使其在 Firebase 上运行?

标签: regexfirebasefirebase-realtime-databasefirebase-security

解决方案


你需要在这里做两件事:

  • 确保所有反斜杠都加倍
  • 将所有非捕获组转换为捕获组并重新调整反向引用(注意应消除冗余捕获组)(注意不能\15用作反向引用,似乎只支持 1 到 9 个反向引用)
  • 重新修改模式,使字符串锚点的开头出现在正则表达式^的开头和结尾(否则,您将得到非法的正则表达式异常)。$在这里很容易做到,因为您的模式是^a1$|^a2$|^a3$类型,它等于^(?:a1|a2|a3)$.

图案应该看起来像

newData.val().matches(/^((31([-\\/.])(0?[13578]|1[02])\\3|(29|30)([-\\/.])(0?[13-9]|1[0-2])\\6)(1[6-9]|[2-9]\\d)?\\d{2}|29([-\\/.])0?2\\9((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])[-\\/.](1[6-9]|[2-9]\\d)?\\d{2})$/)

请注意,我也变成(\/|-|\.)([-\/.])(因为字符类比使用单字符替代品的普通交替更有效)并从中删除了一个逗号[1,3-9]- 它看起来像一个错字,你想匹配1或一个数字 from 3to 9,我相信,还有一个,在字符类中按字面意思对待。


推荐阅读