我试图使用以下正则表达式验证生日:
^(?:(?: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})$此regex在在线regex测试器中测试时工作,但当我试图在我的防火墙规则中使用此regex时,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上工作?
发布于 2018-05-28 18:58:03
你需要在这里做两件事:
\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或从3到9的数字,而,实际上是在字符类中处理的。
https://stackoverflow.com/questions/50571573
复制相似问题