【问题标题】:Firebase Rules Regex BirthdayFirebase 规则正则表达式生日
【发布时间】:2018-05-28 18:04:49
【问题描述】:

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

^(?:(?: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 似乎不接受它。我还尝试将反斜杠加倍,但仍然没有运气。

这是我的 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 上运行?

【问题讨论】:

  • 我尝试将反斜杠加倍,但仍然没有成功。
  • 我仍然收到完全相同的错误:(
  • 抱歉,我忘了删除一个^。见regex101.com/r/3pJKH8/2。关键是你不能在模式内重复^和$,^和$只允许在开头(^)和结尾($)出现一次
  • 这个表达式被firebase接受,没有错误,但是当我尝试传递生日时,正则表达式拒绝它。
  • 它应该可以工作,请参阅this demo。您是否将其作为字符串传递?

标签: regex firebase firebase-realtime-database firebase-security


【解决方案1】:

你需要在这里做两件事:

  • 确保所有反斜杠都加倍
  • 将所有非捕获组变为捕获组并重新调整反向引用(注意应消除冗余捕获组)(注意不能使用\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 的数字,我相信,, 在字符类中被逐字处理。

【讨论】:

  • @RyanDailey 我更新了一个更精确的版本,因为你可能不想匹配14/02-1954,只匹配14/02/1954 或14-02-1954。
  • 感谢您的更新!我尝试使用更新的正则表达式,它给了我一个错误,与我之前遇到的错误相同。
  • @RyanDailey 我只将一个替代方案分成 3 个。这是使您的原始正则表达式按要求工作的唯一方法。
  • 有没有办法让这项工作在我的 Firebase 控制台中不出现任何错误?截至目前,您提交的新正则表达式答案不起作用。
  • @RyanDailey 好的,我回滚到以前的版本。我无法访问 Firebase 控制台,因此无法对其进行更多改进。尽管如此,考虑到我们遇到的所有限制,this more precise pattern 看起来是正确的。
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多