【问题标题】:How to validate usernames using matches(regex)?如何使用匹配(正则表达式)验证用户名?
【发布时间】:2016-09-15 05:40:24
【问题描述】:

我正在尝试将以下表达式放入 match 函数中,但我猜测在尝试编译规则时会出错。

 ^[a-zA-Z](([\._\-][a-zA-Z0-9])|[a-zA-Z0-9])*[a-z0-9]$

.validate 规则如下:

".validate": "newData.val() === auth.uid         
&& newData.val().matches(^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-]*[a-z0-9]$)" 

我明白了:

" Invalid escape: '\.'"

【问题讨论】:

  • 匹配(/^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-] *[a-z0-9]$/)
  • @Pawan 仍然遇到同样的错误。
  • @SalmanAA 在 Firebase 中作为规则匹配?
  • 您需要使用 \\ 。代替 \。和 \\- 而不是 \-,检查文档是否有帮助 firebase.com/docs/security/guide/…
  • 在 Firebase 安全规则中输入正则表达式时,您需要转义反斜杠。所以^[a-zA-Z](([\\._\\-][a-zA-Z0-9])|[a-zA-Z0-9])*[a-z0-9]$

标签: regex firebase firebase-authentication firebase-security


【解决方案1】:

您似乎无法在 Firebase 中使用环视,因此应调整您的模式和整个方法以解决此问题。

您当前的正则表达式需要 5 到 10 个符号的字符串长度,并且不允许 2 个连续符号 ._-。第一个条件应该在正则表达式之外使用newData.val().length >= 5 && newData.val().length <= 10 之类的代码进行检查,第二个条件只需要重新分组和重新量化:

.matches(/^[a-z][a-z0-9]*([._-][a-z0-9]+)*$/)

查看正则表达式demo

详情

  • ^ - 字符串开头
  • [a-z] - 小写字母(如果在末尾添加/i,则区分大小写)
  • [a-z0-9]* - 零个或多个 a-z0-9 符号
  • ([._-][a-z0-9]+)* - ._- 后跟 一个或多个(如果有 ._ 或字符串中的-) 来自0-9a-z 范围的字符
  • $ - 字符串锚的结尾。

请注意,您不需要转义字符类中的字符,因为 ._ 不是其中的特殊字符,而 - 位于括号表达式(字符类)的末尾或开头是文字连字符。

【讨论】:

  • 虽然 Frank 的模式 ^[a-zA-Z](([\\._\\-][a-zA-Z0-9])|[a-zA-Z0-9])*[a-z0-9]$ 似乎是正确的,但它涉及更多的回溯,而我的模式更线性并遵循 unroll-the-loop principle
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 2017-10-04
  • 2011-05-24
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多