【问题标题】:How to design a regex in Firebase?如何在 Firebase 中设计正则表达式?
【发布时间】:2019-06-11 01:43:50
【问题描述】:

我无法弄清楚为什么我的正则表达式会匹配在 Firebase 上用于验证用户名时不应该匹配的内容。

我已经尝试阅读其他帖子,例如 How to validate usernames using matches(regex)?,但我仍然无法弄清楚我做错了什么。

我使用的正则表达式是:

/^\\S+(\\s\\S+)*$/

这是我在这里定义的规则的一部分:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "auth != null",
        ".write": "$uid === auth.uid",
        ".validate": "newData.hasChildren(['username'])",
        "username": {
          ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 21 && newData.val().matches(/^\\S+(\\s\\S+)*$/)"
        }
      }
    }
  }
}

我希望能够匹配不以空格字符开头或结尾的字符串,并且没有任何连续的空格字符。

不包括引号,我预计 "this is a username" 之类的东西会匹配," hello world" 会失败,但是当我在 Firebase 上使用模拟器测试它们时它们都通过了。

Firebase 模拟器输出:

【问题讨论】:

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


    【解决方案1】:

    我以前从未使用过\S,所以必须查一下它的作用。但它确实似乎在这里造成了问题。我不知道为什么,但它似乎在我的快速测试中包含了空格字符,尽管有趣的是,\S 不匹配标签。

    您可能想尝试使用\w,它对我有用并且非常相似。或者您可以将 \\s 自己反转为 newData.val().matches(/^[^\\s].*$/),这相当于您正在尝试的内容。

    在最后一个中,我将(\\s\\S+)* 替换为更简单的.*,它应该是等效的。

    【讨论】:

    • 谢谢!我接受了你自己否定 \s 的建议,它奏效了!我的正则表达式现在是/^[^\\s]+(\\s[^\\s]+)*$/。这可能是 \S 的错误吗?
    • 我确实为它提交了一个内部错误,因为似乎文档具有误导性/错误,或者实现错误。 :)
    猜你喜欢
    • 2019-10-15
    • 2017-11-23
    • 1970-01-01
    • 2018-03-21
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多