首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >消防基地规则Regex生日

消防基地规则Regex生日
EN

Stack Overflow用户
提问于 2018-05-28 18:04:49
回答 1查看 501关注 0票数 1

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

代码语言:javascript
复制
^(?:(?: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似乎不接受它。我也尝试加倍我的反斜杠,但仍然没有运气。

这是我的基本规则:

代码语言:javascript
复制
".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上工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-28 18:58:03

你需要在这里做两件事:

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

模式应该看起来像

代码语言:javascript
复制
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或从39的数字,而,实际上是在字符类中处理的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50571573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档